Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdbool.h>
- #include <stdlib.h>
- const int maxn = 2e8 + 7;
- const int cache = 20000;
- int if_compound[40000];
- int primes[15000];
- int prime_end;
- void push_prime(int x) {
- primes[prime_end] = x;
- ++prime_end;
- }
- int primes_size() {
- return prime_end;
- }
- void set_bit(int i) {
- int num = i / 32;
- int bit = i % 32;
- if_compound[num] |= 1 << bit;
- }
- int ask_bit(int i) {
- int num = i / 32;
- int bit = i % 32;
- return if_compound[num] == (if_compound[num] | (1 << bit));
- }
- void clear() {
- int i = 0;
- for (i; i < 40000; ++i)
- if_compound[i] = 0;
- }
- int min(int a, int b) {
- if (a < b)
- return a;
- else
- return b;
- }
- int main() {
- int n, i, j, lst, x;
- lst = 0;
- scanf("%d", &n);
- int ans = 0;
- for (i = 2; i * i <= n; ++i)
- if (!ask_bit(i)) {
- ++ans;
- push_prime(i);
- for (j = i; j * j <= n; j += i)
- set_bit(j);
- }
- int l = i;
- int r = min(l + cache, n + 1);
- while (l <= n) {
- clear();
- for (x = 0; x < primes_size(); ++x) {
- for (i = ((l + primes[x] - 1) / primes[x]) * primes[x]; i < r; i += primes[x]) {
- set_bit(i - l);
- }
- }
- for (i = l; i < r; ++i)
- if (!ask_bit(i - l))
- ++ans;
- l += cache;
- r = min(l + cache, n + 1);
- }
- printf("%d", ans);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement