P3383 【模板】线性筛素数
P3383 【模板】线性筛素数
题解
说好的数组不能开很大的呢!??!这个题开了1e7+10的数组也没事QWQ
埃氏筛也能水过
代码
1.线性筛
#include<bits/stdc++.h> using namespace std; const int maxn=1e7+10; int not_prime[maxn],prime[maxn]; int m,n,cnt_pri; int a[maxn]; void xxs(int mn) { memset(not_prime,0,sizeof(not_prime)); not_prime[1]=1; for(int i=2;i<=mn;i++) { if(!not_prime[i]) prime[++cnt_pri]=i; for(int j=1;j<=cnt_pri;j++) { if(prime[j]*i>mn) break; not_prime[prime[j]*i]=1; if(i%prime[j]==0) break; } } } int main() { scanf("%d%d",&m,&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); xxs(m); for(int i=1;i<=n;i++) if(not_prime[a[i]]) printf("No\n"); else printf("Yes\n"); }
2.埃氏筛
#include<bits/stdc++.h> using namespace std; const int maxn=1e7+10; int is_prime[maxn]; int m,n; int a[maxn]; int main() { scanf("%d%d",&m,&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); memset(is_prime,1,sizeof(is_prime)); is_prime[1]=0; for(int i=2;i<=m;i++) { if(is_prime[i]) for(int j=i+i;j<=m;j+=i) is_prime[j]=0; } for(int i=1;i<=n;i++) if(is_prime[a[i]]) printf("Yes\n"); else printf("No\n"); }