http://acmpj.zstu.edu.cn/JudgeOnline/showproblem?problem_id=3794
大数的素数判断很吊的样子,现在这里记录一下吧- -当初水过去了。。。
#include<iostream> #include<ctime> using namespace std; long long factor[100],fac_top=-1; long long muti_mod(long long a,long long b,long long n) { long long exp=a%n,res=0; while(b) { if(b&1) { res+=exp; if(res>n) res-=n; } exp<<=1; if(exp>n) exp-=n; b>>=1; } return res; } long long mod_exp(long long a,long long p,long long m) { long long exp=a%m,res=1; while(p>1) { if(p&1) res=muti_mod(res,exp,m); exp=muti_mod(exp,exp,m); p>>=1; } return muti_mod(res,exp,m); } bool miller_rabin(long long n, long long times) { if(n==2) return 1; if(n<2||!(n&1)) return 0; long long a,u=n-1,x,y; int t=0; while(u%2==0) { t++; u/=2; } srand(time(0)); for(int i=0;i<times;i++) { a=rand()%(n-1)+1; x=mod_exp(a,u,n); for(int j=0;j<t;j++) { y=muti_mod(x,x,n); if(y==1&&x!=1&&x!=n-1) return false; x=y; } if(y!=1) return false; } return true; } int main(void) { long long t,n,min; cin>>t; while(t--) { cin>>n; fac_top=min=-1; while(!miller_rabin(n,10)) miller_rabin(n++,10); cout<<n<<endl; } return 0; }