Loading

莫比乌斯反演

莫比乌斯函数

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

 

 线性筛莫比乌斯函数 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];
        }
    }
}
View Code

 

posted @ 2020-03-08 20:29  MQFLLY  阅读(198)  评论(0编辑  收藏  举报