nadal jest cos zle ;x
#include <iostream>
#include <cstdlib>
#include <time.h>
#include<sstream>
using namespace std;
const int n = 11;
bool numbersTable[n + 1];
void sito()
{
for (int i = 2; i*i <= n; i++ )
{
if (numbersTable[i] == true)
continue;
for (int j = 2*i ; j <= n; j += i)
numbersTable[j] = true;
}
// if (numbersTable[i] == false)
}
// 64 bitowy generator pseudolosowy
//---------------------------------
// Funkcja mnoży a i b mod n
//--------------------------
int unsigned long long MnozModulo(int unsigned long long a, int unsigned long long b, int unsigned long long n)
{
int unsigned long long m,w;
w = 0;
for(m = 1; m; m <<= 1)
{
if(b & m) w = (w + a) % n;
a = (a << 1) % n;
}
return w;
}
// Funkcja oblicza a^e mod n
//--------------------------
int unsigned long long PotegujModulo(int unsigned long long a, int unsigned long long e, int unsigned long long n)
{
int unsigned long long m,p,w;
p = a; w = 1;
for(m = 1; m; m <<= 1)
{
if(e & m) w = MnozModulo(w,p,n);
p = MnozModulo(p,p,n);
}
return w;
}
int main()
{
stringstream ss;
sito();
int unsigned long long a,d,p,x;
int i,j,s,licznik=0;
bool t;
string b,tmp;
cin>>b;
for(;b.size()!=1;)
{
tmp=b.substr(0,9);
ss<<tmp;
ss>>p;
ss.clear();
for(;p>99;){
s = 0;
for(d = p - 1; d % 2 == 0; s++) d /= 2;
t = true;
for (int i = 2; i <= n; i++)
if (numbersTable[i] == false) {
a =i;
x = PotegujModulo(a,d,p);
if((x == 1) || (x == p - 1)) continue;
for(j = 1; (j < s) && (x != p - 1); j++)
{
x = MnozModulo(x,x,p);
if(x == 1)
{
t = false; break;
}
}
if(!t) break;
if(x != p - 1)
{
t = false; break;
}
}
if(t)
licznik++;
p=p/10;
}
b.erase(0,1);
}
cout<<licznik;
return 0;
}