const int maxn=1e5+10;
int prime[maxn],cnt;
bool vis[maxn];
vector<int> f[maxn];
void get_prime_fac(){
for(int i=2;i<maxn;i++){
if(!vis[i]){
prime[cnt++]=i;
for(int j=i;j<maxn;j+=i){
f[j].push_back(i);
vis[j]=1;
}
}
}
}
也可以用莫比乌斯函数,计算所有数的素因子以及互异素因子
const int maxn=1e5+10;
int mu[maxn],cnt,prime[maxn];
bool vis[maxn];
vector<int> f[maxn];
void get_mu_fac(){
memset(vis,0,sizeof vis);
mu[1]=1;
int tot=0;
for(int i=2;i<maxn;i++){
if(!vis[i]){
prime[tot++]=i;
mu[i]=-1;
}
for(int j=0;j<tot;j++){
if(i*prime[j]>=maxn) break;
vis[i*prime[j]]=1;
if(i%prime[j]==0){
mu[i*prime[j]]=0;
break;
}else{
mu[i*prime[j]]=-mu[i];
}
}
}
for(int i=2;i<maxn;i++){
if(mu[i]!=0){
for(int j=i;j<maxn;j+=i){
f[j].push_back(i);
}
}
}
}

本文介绍了一种使用素数筛法获取所有小于等于1e5+10范围内的素数及其倍数的算法,并进一步讨论了如何通过莫比乌斯函数计算这些数的素因子和互异素因子,为数论和算法竞赛提供了基础工具。
6

被折叠的 条评论
为什么被折叠?



