质因数分解法求Mobius函数
const int MAXN = 1e6 + 10;
int p[MAXN], ptop;
int pm[MAXN], pk[MAXN], mu[MAXN];
void sieve(int n) {
memset(pm, 0, sizeof(pm[0]) * (n + 1));
ptop = 0, pm[1] = 1, pk[1] = 1, mu[1] = 1;
for(int i = 2; i <= n; ++i) {
if(!pm[i]) {
p[++ptop] = i, pm[i] = i;
pk[i] = i, mu[i] = -1;
}
for(int j = 1, t; j <= ptop && (t = i * p[j]) <= n; ++j) {
pm[t] = p[j];
if(i % p[j]) {
pk[t] = pk[p[j]];
mu[t] = mu[i] * mu[p[j]];
} else {
pk[t] = pk[i] * p[j];
mu[t] = (pk[t] == t) ? 0 : mu[t / pk[t]] * mu[pk[t]];
break;
}
}
}
}