4278. 【NOIP2015模拟10.29B组】质数

22 篇文章 0 订阅

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<M≤800,000。
50%的数据满足N≤1,000,1<M≤100,000,000。
100%的数据满足N≤1,000,1<M≤1,000,000,000,000。

Solution

Miller_Rabin算法模板题。

Code

#include<cstdio> 
#include<algorithm>
#include<cstring>
#include<cstdlib>
#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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值