Description
定义质数为因数只含1和其本身的数,对于N组询问,试判断每个数是否为素数。
Input
第一行一个正整数N,表示有N组询问。
接下来N行,每行一个正整数M,表示询问M是否为质数。
Output
输出N行,每行一个字符串。
若是质数则输出‘Prime’,若不是质数则输出‘Not prime’。
Sample Input
5
2
10
89807289
9032482948
1000000007
Sample Output
Prime
Not prime
Not prime
Not prime
Prime
样例解释:
10=2*5
89807289=3 * 11 * 11 * 13 * 19031
9032482948=2 * 2 * 439 * 5143783
Data Constraint
20%的数据满足N≤100,1 50%的数据满足N≤1,000,1 100%的数据满足N≤1,000,1
Solution
Miller_Rabin算法模板题。
Code
#include
#include
#include
#include
#define I int
#define F(i,a,b) for(I i=a;i<=b;i++)
#define Fd(i,a,b) for(I i=a;i>=b;i--)
#define mem(a,b) memset(a,b,sizeof(a))
#define N 10000000
#define ll long long
#define P(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout)
#define rt return
using namespace std;
void rd(ll &x){
x=0;char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
}
ll x,n;
I a[13]={2,3,5,7,11,13,17,19,23,29,31,37,101};
ll ksc(ll x,ll y,ll p){
ll sum=0;
while(x){
if(x&1) sum=(sum+y)%p;
y=(y*2)%p;
x>>=1;
}
rt sum;
}
ll ksm(ll x,ll k,ll p){
if(k==1) rt x;
ll st=ksm(x,k/2,p);st=ksc(st,st,p);
if(k&1) rt ksc(st,x,p);
rt st;
}
I pd(ll x){
if(x==2) rt 1;
if(x<2||x%2==0) rt 0;
ll d=x-1,y,k=0,s;
while(d%2==0){k++,d/=2;}
F(i,0,12){
if(x==a[i]) rt 1;
s=ksm(a[i],d,x);
F(j,1,k){
y=ksc(s,s,x);
if(y==1&&s!=1&&s!=x-1) rt 0;
s=y;
}
if(s!=1) rt 0;
}
rt 1;
}
I main(){
P("prime");
rd(n);
while(n--){
rd(x);
if(pd(x)) printf("Prime\n");
else printf("Not prime\n");
}
rt 0;
}
作者:zsjzliziyang
QQ:1634151125
转载及修改请注明
本文地址:https://blog.csdn.net/zsjzliziyang/article/details/99765402