传送门
miller−rabbin素数测试的模板题。
实际上miller−rabbin就是利用费马小定理和二次探测的性质来进行判断的。
注意要多带几个素数进去判断(听大神说只要取遍了50以内的质数就可以判断int范围内的)
代码:
#include<bits/stdc++.h>
#define ri register int
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
typedef long long ll;
int s,t,n,ans,pri[14]={2,3,5,7,11,13,17,19,23,29,31,37,41,47};
inline int ksm(int a,int p,int mod){int ret=1;for(;p;p>>=1,a=(ll)a*a%mod)if(p&1)ret=(ll)ret*a%mod;return ret;}
inline bool check(int x,int a){
if(ksm(a,x-1,x)^1)return 0;
a=ksm(a,t,x);
if(a==1||a==x-1)return 1;
for(ri i=0;i<s;++i){
a=(ll)a*a%x;
if(a==x-1)return 1;
}
return 0;
}
inline bool MRT(int x){
if(!(x&1))return x==2;
s=0,t=x-1;
while(!(t&1))t>>=1,++s;
for(ri i=0;i<14;++i){
if(x==pri[i])return 1;
if(!(x%pri[i]))return 0;
if(!check(x,pri[i]))return 0;
}
return 1;
}
int main(){
freopen(\"lx.in\",\"r\",stdin);
while(~scanf(\"%d\",&n)){
ans=0;
while(n--)if(MRT(read()))++ans;
cout<<ans<<\'\\n\';
}
return 0;
}
继续阅读与本文标签相同的文章
下一篇 :
最全的批量图片压缩工具 在线无损压缩
-
每分钟进出车辆2.5台 智能立体车库解锁停车难
2026-05-19栏目: 教程
-
一文了解机器学习必学10大算法
2026-05-19栏目: 教程
-
开一家线上外卖门店选址要注意哪些因素?
2026-05-19栏目: 教程
-
信院人的APP,你get到了吗?
2026-05-19栏目: 教程
-
对话FILA姚伟雄:安踏赋予独立性,未来坚持做直营
2026-05-19栏目: 教程
