莫比乌斯函数的线性筛
原创
©著作权归作者所有:来自51CTO博客作者wx5a330bd704750的原创作品,请联系作者获取转载授权,否则将追究法律责任
莫比乌斯函数
\[\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];
}
}
}
}