https://blog.csdn.net/tomandjake_/article/details/81083703
上面这篇文章讲得很好
下面我对模板做一些分析
int mu[maxn], vis[maxn];
int primes[maxn], cnt;
void get_mu() {
memset(vis, 0, sizeof(vis));
memset(mu, 0, sizeof(mu));
cnt = 0; mu[1] = 1;
for (int i = 2; i <= maxn; ++i) {
if (!vis[i]) { primes[cnt++] = i; mu[i] = -1; }
for (int j = 0; j<cnt&&primes[j] * i <= maxn; ++j) {
vis[primes[j] * i] = 1;
if (i%primes[j] == 0)break;
mu[i*primes[j]] = -mu[i];
}
}
}
mu[]就是莫比乌斯函数μ
去掉关于mu的部分就是欧拉筛了
素数的质因子只有他自己,所以mu[]=-1
合数的话,不会在质数那一关被赋初值,只能在筛选素数的时候赋初值,而由于最后一句话在if下面,因此像4这样的高阶合数是不会被赋值的,也就是0.被赋值的都是一阶合数(阶数是质因子的最高阶数)