2020.7.16 T1【NOIP2015模拟10.29B组】质数(jz暑假训练day2)

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

赛时

下意识认为筛法不可取,然后用了费马小定理。。。。。。然后就50分了

正解

就是筛。。。。。。
由于x最大是10^12,所以只需要将 10^6内的素数筛出来就行了,之后与xmod就行,那么筛法就都可以啦。

代码

#include
#include
using namespace std;
int n,cnt,prime[100007];
bool zs[100007];
int main(){
	freopen("prime.in","r",stdin);
	freopen("prime.out","w",stdout);
	memset(zs,1,sizeof(zs));
	for(int i=2;i<=100000;i++){//埃筛
		if(zs[i]){
			for(int j=2;j*i<=100000;j++)
				zs[j*i]=0;
		}
	}
	for(int i=2;i<=100000;i++)
		if(zs[i]) prime[++cnt]=i;
	scanf("%d",&n);
	while(n--){
		long long x;
		scanf("%lld",&x);
		if(x<=100000){
			if(zs[x]) printf("Prime");
			else printf("Not prime");
		}else{
			bool bz=1;
			for(int i=1;i<=cnt;i++){
				if(x%prime[i]==0){
					bz=0;
					break;
				}
			}
			if(bz)printf("Prime");
			else printf("Not prime");
		}
		printf("\n");
	}
}

你可能感兴趣的:(2020.7.16 T1【NOIP2015模拟10.29B组】质数(jz暑假训练day2))