线性筛求积性函数
1.线性筛
求\(n\)以内所有的质数。
vs[1] = 1;
for(int i = 2;i <= n;++ i){
if(!vs[i]) p[++tot] = i;
for(int j = 1;j <= tot&&i*p[j] <= n;++ j){
vs[i*p[j]] = 1;
if(i%p[j] == 0) break;//魔法
}
}
2.线性筛求积性函数模板
以求\(d(i)\)为例(求\(i\)因数个数)。

(截取自《深入浅出程序设计竞赛进阶篇》)
f[1] = 1;
for(int i = 2;i <= n;++ i){
if(!vs[i]){
p[++tot] = i;
k[i] = i;
f[i] = i;//f[i]的值
}
for(int j = 1;j <= tot&&i*p[j] <= n;++ j){
if(i%p[j] == 0){
k[i*p[j]] = k[i]*p[j];
if(k[i*p[j]] != i*p[j])
f[i*p[j]] = f[k[i]*p[j]]*f[i*p[j]/k[i*p[j]]];
else f[i*p[j]] = p[j]/f[i];//f[i]的值
break;
}
}
else{
k[i*p[j]] = p[j];
f[i*p[j]] = f[p[j]]*f[i];
}
}

浙公网安备 33010602011771号