小黄书第19章p82页根据合数的拉宾-米勒测试可得到素数的必要条件。
以POJ1811 Prime Test 为例。
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
typedef long long LL;
const int S=20;
LL pfact[10005],ant;
LL multi_mod(LL a,LL b,LL c){ //防止a*b溢出!
LL ans=0;
while(b){
if(b&1){
ans=(ans+a)%c;
}
a<<=1;
if(a>=c)a%=c;
b>>=1;
}
return ans;
}
LL pow_mod(LL a,LL b,LL c){
LL ans=1;
while(b){
if(b&1){
ans=multi_mod(ans,a,c);
}
a=multi_mod(a,a,c);
b>>=1;
}
return ans;
}
b