莫比乌斯函数

\[\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];
}
}
}
}