Description
- 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内)
Input&Output
Input
- 第一行包含两个正整数N、M,分别表示查询的范围和查询的个数。
-
接下来M行每行包含一个不小于1且不大于N的整数,即询问该数是否为质数。
Output
输出包含M行,每行为Yes或No,即依次为每一个询问的结果。
Solution
- 欧拉筛法的优势在于,在当前i mod 当前素数为0时就退出,保证了每个合数一定只被它的最小素因子筛掉,从而在O(n)时间内完成。
-
代码如下:
#include<iostream> #include<cstring> using namespace std; int num[100000]; long long prime[5000001]; bool is_prime[10000001]; int N,M; int cnt=1; int main() { for(int k=0;k<10000001;k++) { is_prime[k]=true; } cin>>N>>M; is_prime[0]=false; is_prime[1]=false; is_prime[2]=true; prime[1]=2; for(int i=2;i<N;i++) { if(is_prime[i]==true){prime[cnt]=i;cnt++;} for(long long j=1;j<=cnt&&prime[j]*i<=N;j++) { is_prime[prime[j]*i]=false; if(i%prime[j]==0)break; } } for(int i=0;i<M;i++) { cin>>num[i]; if(is_prime[num[i]]==false)cout<<"No"<<endl; else cout<<"Yes"<<endl; } return 0; }