莫比乌斯函数

求单个莫比乌斯函数 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];
}
}
}

来源:https://www.cnblogs.com/hznumqf/p/12444686.html
