莫比乌斯反演

懵懂的女人 提交于 2020-03-08 22:12:57

莫比乌斯函数

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

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!