bool vis[Maxn];
int mu[Maxn], prim[Maxn];
void Mobius() {
mu[1] = 1;
int tot = 0;
for (int i = 2; i <= Maxn; i ++) {
if(!vis[i]) {
prim[tot ++] = i;
mu[i] = -1;
}
for (int j = 0; j < tot; j ++){
if(i * prim[j] > Maxn) break;
vis[i * prim[j]] = true;
if(i % prim[j] == 0) {
mu[i * prim[j]] = 0;
break;
}
mu[i * prim[j]] = - mu[i];
}
}
}
線性篩 歐拉函數
void init() {
phi[1] = 1;
for(LL i = 2; i <= M; i ++) {
if(!mark[i]) {
prim[++tot] = i;
phi[i] = i - 1;
}
for (LL j = 1; j <= tot; j ++) {
if(i * prim[j] > M) break;
mark[i * prim[j]] = 1;
if(i % prim[j] == 0) {
phi[i * prim[j]] = phi[i] * prim[j];
break;
}
phi[i *prim[j]] = phi[i] * phi[prim[j]];
}
}
}