luogu【模板】线性筛素数 (Miller-Rabin素数测试模板)
这个感觉还是挺好理解的,就是复杂度证明看不懂~
Code:
#include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #define ll long long #define setIO(s) freopen(s".in","r",stdin) int array[10]={2,3,5,7,11,13,17,23}; using namespace std; ll qpow(ll base,ll k,ll mod) { ll tmp=1; for(;k;base=base*base%mod,k>>=1) if(k&1) tmp=tmp*base%mod; return tmp; } int prime(ll x) { if(x<=1) return 0; int i,j,k; ll pre,a,cur; for(i=0;i<8;++i) { if(x==array[i]) return 1; for(cur=x-1,k=0;cur%2==0;cur>>=1) ++k; pre=a=qpow(array[i],cur,x); for(j=1;j<=k;++j) { a=(a*a)%x; if(a==1&&pre!=1&&pre!=x-1) return 0; pre=a; } if(a!=1) return 0; } return 1; } int main() { // setIO("input"); int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=m;++i) { ll a; scanf("%lld",&a),printf("%s\n",prime(a)?"Yes":"No"); } return 0; }