Pagini recente » Cod sursa (job #1966953) | Cod sursa (job #1975889) | Cod sursa (job #1884615) | Rating Neghin Mihai (mihaineghin) | Cod sursa (job #2627139)
#include <bits/stdc++.h>
using namespace std;
const int INF = 2e9;
const int primes[] = {2, 3, 5};
int p2[32];
inline int lgput(int x, int p, int MOD) {
int ans = 1, aux = x;
for (int i = 1; i <= p ; i = i << 1) {
if (i & p) ans = (1LL * ans * aux) % MOD;
aux = (1LL * aux * aux) % MOD;
}
return ans;
}
inline bool fermatCheck(int n, int x, int d, int base) {
int p = lgput(base, x, n);
if (p == 1 || p == n - 1) return true ;
for (int i = 0; i <= d ; ++i) {
p = 1LL * p * p % n;
if(p == n - 1) return true ;
}
return false;
}
bool checkPrime(int n) {
if (n < 2) return false;
int x = n - 1, d = 0;
while (x % 2 == 0) {
x = x >> 1;
++d;
}
for (auto base : primes)
if (!fermatCheck(n, x, d, base)) return false;
return true;
}
int main() {
// for (int i = 1; i <= 100 ; ++i) {
// cerr << i << " ";
// if(checkPrime(i)) cerr << "is prime";
// else cerr << "isn't prime";
//
// cerr << endl;
// }
freopen("ciur.in", "r", stdin);
freopen("ciur.out", "w", stdout);
p2[0] = 1;
for (int i = 1; i <= 30 ; ++i) p2[i] = p2[i - 1] * 2;
int n;
scanf("%d", &n);
int ans = 4;
for (int i = 11; i <= n ; i += 2) {
if (i % 3 == 0 || i % 5 == 0) continue ;
if (checkPrime(i)) ++ans;
}
printf("%d", ans);
return 0;
}