Cod sursa(job #1701447)

Utilizator mihai995mihai995 mihai995 Data 13 mai 2016 08:50:23
Problema Ciurul lui Eratosthenes Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.66 kb
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;

int pow(long a, int n, int mod){
	int ans = 1;
	for (; n; n >>= 1, a = a * a % mod)
		if ( n & 1 ) ans = ans * a % mod;
	return ans;
}
bool pass(long x, int nr, int mod){
	x = pow(x, mod >> nr, mod);
	if ( x == 1 ) return true;
	while (nr--){
		if ( x == mod - 1 )
			return true;
		x = x * x % mod;
	}
	return false;
}
bool prime(int n){
	int s = __builtin_ctz(n - 1);
	return s && pass(31, s, n) && pass(73, s, n);
}

int main(){
	ifstream in("ciur.in");
	ofstream out("ciur.out");
	int n, ans = 1;

	in >> n;
	for (int i = 3; i <= n; i += 2)
		ans += prime(i);
	out << ans << '\n';
	return 0;
}