版权声明:本文为博主原创文章,未经博主允许必须转载。 https://blog.csdn.net/qq_35950004/article/details/82014499
积性函数都能线性筛吗?
对于某些复杂的积性函数(设为F(x)),线性筛可以比较无脑。
线性筛时每个数都只会被它最小的质数筛一次,考虑每个数被筛的时候。
当数x被筛的时候,我们可以知道他的最小质因数y。
情形一:gcd(x/y,y) = 1, F(x) = F(x/y) * F(y);
情形二 : gcd(x/y,y) = y > 1
设x去掉y这个最小质因子后的数为z,z * (y ^ n) = x
F(x) = F(z) * F(y^n)
问题来了,如果z==1,那么x等于y^n,这怎么转移啊!
那么就不线性筛呗,用别的方法。
得出结论,积性函数能线性筛的条件是能够较快的处理F(p^n)(p为质数)
回想一下,μ和φ都是能够快速计算p^n的答案的,那么来个例题:
线性筛F(x) = μ和φ的狄利克雷卷积
参考代码:
void euler(int N = MAXN) {
int i, j;
ish[1] = true;
last[1] = 1;
mup[1] = 1;
for (i = 2; i < N; ++ i) {
if (!ish[i]) {
pri[totp++] = i;
last[i] = 1;
mup[i] = i - 2;
}
for (j = 0; i * pri[j] < N; ++ j) {
int x = i * pri[j];
int p = pri[j];
ish[x] = true;
if (i % p == 0) {
last[x] = last[i];
int pa = x / last[x];
mup[x] = (pa - pa / p * 2 + pa / (p * p)) * mup[last[x]];
//前面括号内的内容为p^n的mup值,O(1)计算
break;
} else {
last[x] = i;
mup[x] = (p - 2) * mup[i];
}
}
}
}