¡Hola chicos! Muchas gracias por participar. Esta es la primera ocasión en la que el Club de Programación Competitiva (CPCFI) escribe problemas originales para un concurso, y nos hizo muchísima ilusión que los resolvieran.
Para quienes tengan la curiosidad, todos los protagonistas de los problemas son personas que pertenecen al CPCFI. Somos una comunidad muy unida y nos hace mucha gracia verlos como protagonistas los problemas. Esperamos que en algún momento de sus carreras consideren unirse al club, que siempre tendrá las puertas abiertas para gente que busque desafíos complicados y una comunidad unida que los apoyará incondicionalmente.
Les deseamos lo mejor en su formación personal y profesional y esperamos verlos de nuevo en la fase final.
Agradecimientos especiales a RacsoFractal, quién hizo posible la creación de estos problemas para el concurso y me invitó a colaborar en este desafío tan grande para el CPCFI.
671145B. Entrenamiento de equipo II
671145C. Lanzadardos inexperto
671145D. El billar no es de vagos II
#include <stdio.h>
#define MAX 2002
int sieve[MAX], nums[MAX], min_dist[MAX], sorted_dist[MAX];
void get_primes() {
sieve[0] = sieve[1] = 1;
for (int i = 2; i < MAX; i++) {
if (sieve[i]) {
continue;
}
for (int j = i * 2; j < MAX; j += i) {
sieve[j] = 1;
}
}
}
void get_min_dist() {
int last_prime = MAX + 100;
for (int i = MAX - 1; i >= 0; i--) {
if (sieve[i] == 0) {
last_prime = i;
}
if (min_dist[i] == 0) {
min_dist[i] = last_prime - i;
} else if (last_prime - i < min_dist[i]) {
min_dist[i] = last_prime - i;
}
}
last_prime = -100;
for (int i = 0; i < MAX; i++) {
if (sieve[i] == 0) {
last_prime = i;
}
if (min_dist[i] == 0) {
min_dist[i] = i - last_prime;
} else if (i - last_prime < min_dist[i]) {
min_dist[i] = i - last_prime;
}
if(min_dist[i/2] + 1 < min_dist[i]){
min_dist[i] = min_dist[i/2] + 1;
}
}
}
void init() {
// Get primes (sieve[i] = 0 is prime)
get_primes();
// Get min distance to p rimes
get_min_dist();
}
void counting_sort() {
for (int i = 0; i < MAX; i++) {
sorted_dist[min_dist[i]] += nums[i];
}
}
int max_primes(int m) {
int ans = 0;
for (int i = 0; i < MAX; i++) {
while (m >= i && sorted_dist[i] > 0) {
ans++;
m -= i;
sorted_dist[i]--;
}
}
return ans;
}
int main() {
init();
int n, m, a;
scanf("%d %d\n", &n, &m);
for (int i = 0; i < n; i++) {
scanf("%d", &a);
nums[a]++;
}
counting_sort();
printf("%d\n", max_primes(m));
}



