莫比乌斯反演
莫比乌斯函数
求单个莫比乌斯函数 O(sqrt(n))
ll getu(ll x) { ll v = 1; for (int i = 2; i * i <= x; i++) { if (x % i == 0) { v = -v, x /= i; if (x % i == 0) return 0; } } if (x != 1) v = -v; return v; }
线性筛莫比乌斯函数 O(n)
// 莫比乌斯函数线性筛 // 同时求出素数表 int prime[maxn], prime_tot; int is_prime[maxn]; int mu[maxn]; void pre_calc(int lim) { mu[1] = 1; for (int i = 2; i <= lim; i++) { if (!is_prime[i]) { prime[++prime_tot] = i; mu[i] = -1; } for (int j = 1; j <= prime_tot; j++) { if (i * prime[j] > lim) break; is_prime[i * prime[j]] = 1; if (i % prime[j] == 0) { mu[i * prime[j]] = 0; break; } else mu[i * prime[j]] = -mu[i]; } } }