P3383 【模板】线性筛素数
线性筛法
让每个合数只被它最小的素因数筛到
从而保证每个数均摊复杂度为O(1)
总复杂度O(n)
具体看模板
#include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<cstring> using namespace std; const int N=10000007; int n,m,pri[N],cnt;//pri存素数 bool not_pri[N]; //not_pri判断是否是素数,1代表不是,0代表是 int main() { cin>>n>>m; not_pri[1]=1;//1不是素数 for(int i=2;i<=n;i++) { if(!not_pri[i]) pri[++cnt]=i;//更新素数 for(int j=1;j<=cnt;j++) { int t=i*pri[j]; if(t>n) break; not_pri[t]=1;//筛素数 if(i%pri[j]==0) break;//核心,保证每个数只被它最小的素因数筛到 //后面所有大于pri[j]的素数*i = pri[j]*k(k>i) } } int a; while(m--) { scanf("%d",&a); if(not_pri[a]) printf("No\n"); else printf("Yes\n"); } return 0; }