013.质数筛
预处理 2 ~ n 的全部质数
埃氏筛
判断是否为质数
bitset<100005>ehrlich(int n){
bitset<100005>isp;
isp.set();//初始化为1
isp[0]=isp[1]=0;
for(int i=2;i*i<=n;++i){
if(isp[i]){
for(int j=i*i;j<=n;j+=i)
isp[j]=0;
}
}
return isp;
}
如果只用于统计质数数量
int cnt_p(int n){
if(n<=1)return 0;
vector<bool>vis(n+1,0);
int cnt=(n+1)/2;
for(int i=3;i*i<=n;i+=2){
if(!vis[i]){
for(int j=i*i;j<=n;j+=2*i){
if(!vis[j]){
vis[j]=1;
cnt--;
}
}
}
}
return cnt;
}
欧拉筛
获取 2 ~ n 所有质数
vector<int> euler(int n){
vector<bool>vis(n+1,0);
vector<int>p;
for(int i=2;i<=n;i++){
if(!vis[i])p.push_back(i);
for(int j=0;j<(int)p.size()&&p[j]*i<=n;j++){
vis[p[j]*i]=1;
if(i%p[j]==0)break;
}
}
return p;
}
预处理欧拉函数
int E[];
int p[];
bool isp[];
void EUler(int n){
E[1]=1;
int cnt=0;
for(int i=2;i<=n;i++){
if(!vis[i]){
p[++cnt]=i;
E[i]=i-1;
}
for(int j=1;j<=cnt&&p[j]*i<=n;j++){
vis[i*p[j]]=1;
if(i%p[j]==0){
E[p[j]*i]=E[i]*p[j];
break;
}
E[p[j]*i]=E[i]*(p[j]-1);
}
}
}
快期末了,越来越水了(?
I am the bone of my sword

浙公网安备 33010602011771号