线性筛的一般形式

版权声明:本文为博主原创文章,未经博主允许必须转载。 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];
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_35950004/article/details/82014499