莫比乌斯函数的线性筛

莫比乌斯函数

\[\mu(n) = \begin{cases} 1, & \text{if } n = 1 \\ (-1)^k, & \text{if } n = p_1p_2 \ldots p_k \\ 0, & \text{others} \end{cases}\]

即:

  • \(\mu(1) = 1\)
  • \(n\) 存在平方因子时,\(\mu(n) = 0\)
  • \(n\) 是素数或奇数个不同素数之积时,\(\mu(n) = -1\)
  • \(n\) 是偶数个不同素数之积时,\(\mu(n) = 1\)

莫比乌斯函数的线性筛

代码实现:

int prime[maxn], prime_cnt, mu[maxn];
bool prime_tag[maxn];

void init() {
    mu[1] = 1;
    for (int i = 2; i < maxn; i++) {
        if (!prime_tag[i]) {
            prime[prime_cnt++] = i;
            mu[i] = -1;
        }
        for (int j = 0; j < prime_cnt && prime[j] < maxn / i; j++) {
            prime_tag[i * prime[j]] = true;
            if (i % prime[j] == 0) {
                mu[i * prime[j]] = 0;
                break;
            } else {
                mu[i * prime[j]] = -mu[i];
            }
        }
    }
}
posted @ 2022-11-09 11:25  quanjun  阅读(35)  评论(0)    收藏  举报