首先是2^63以内可以用的算法,用Miller_Rabin素数测试
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cmath>
using namespace std;
typedef unsigned long long ll;
const int S = 20;
ll mult_mod(ll a, ll b, ll c)
{
a %= c;
b %= c;
ll ret = 0, tmp = a;
while(b){
if(b & 1){
ret += tmp;
if(ret > c) ret -= c;
}
tmp <<= 1;
if(tmp > c) tmp -= c;
b >>= 1;
}
return ret;
}
ll pow_mod(ll a, ll n, ll mod)
{
ll ret = 1, tmp = a % mod;
while(n){
if(n & 1) ret = mult_mod(ret, tmp, mod);
tmp = mult_mod(tmp, tmp, mod);
n >>= 1;
}
return ret;
}
bool check(ll a, ll n, ll x, ll t)
{
ll ret = pow_mod(a, x, n);
ll last = ret;
for(int i = 1; i <= t; i++){
ret = mult_mod(ret, ret, n);
if(ret == 1 && last