题目:线性筛素数
思路:
复习。
以前写的线性筛求欧拉函数模板,好毒啊,表示看不懂惹……
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 10000000
#define read(x) scanf("%d",&x)
int n,m;
int euler[maxn+5];
vector<int> prm;
void init() {
for(int i=2;i<=n;i++) euler[i]=i;
for(int i=2;i<=n;i++) {
if(euler[i]==i) {
euler[i]=i-1;
prm.push_back(i);
}
for(int j=0;j<prm.size()&&prm[j]*i<=n;j++) {
if(i%prm[j]==0) {
euler[i*prm[j]]=euler[i]*prm[j];
} else {
euler[i*prm[j]]=euler[i]*euler[prm[j]];
}
}
}
}
int main() {
read(n),read(m);
init();
while(m--) {
int x;
read(x);
if(x==1) printf("No\n");
else if(euler[x]!=x-1) printf("No\n");
else printf("Yes\n");
}
return 0;
}