bzoj 5455

莫比乌斯反演

答案求$\sum_{i=1}^{n}{\sigma(i^{2})}$

转化一下

设$f(i)=\sum_{d|i}{\mu(d)^{2}}$

答案等于

$\sum_{i=1}^{n}\sum_{d|i}{f(d)}$

为什么呢,这么思考一下,我们求的是每个$i^{2}$的约数个数,枚举$i$的约数$d$,$d^{2}$是$i^{2}$的约数

假设对$i^{2}$进行质因数分解后,设质数$p$是$i$的约数,指数是$a$,那么在$i^2$的约数中$p$的次数可以是$[0,2a]$

这时我们枚举$i$的约数$d$,对于质数$p$,在$d$中的次数为$b$,在$d^{2}$中的次数为$2b$,通过枚举$d$我们可以枚举到所有$2b \leq 2a$

但是没有枚举到奇数次指数,这时枚举$d$的约数$D$,求$f(D)$的和,相当于枚举给所有$2b$是否$-1$,这样就覆盖到了所有奇数偶数情况。

继续化简

$ans=\sum_{i=1}^{n}\sum_{d|i}\sum_{D|d}{\mu(D)^{2}}$

把$D$提到最外层

$ans=\sum_{D=1}^{n}{\mu(D)^{2}S([\frac{n}{D}])}$

$S(n)=\sum_{i=1}^{n}{[\frac{n}{i}]}$

可以$O(\sqrt{n})$时间求出来

考虑前一项

$\sum_{i=1}^{n}{\mu(i)^{2}}=\sum_{i=1}^{\sqrt{n}}{\mu(i)[\frac{n}{i^{2}}]}$

也可以$O(\sqrt{n})$求出来

总复杂度$O(n^{\frac{2}{3}})$

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 5;
int n;
int mu[maxn], p[maxn], mark[maxn];
ll f(int n) {
    ll ret = 0;
    for(int i = 1; i * i <= n; ++i) ret += 1LL * mu[i] * (n / (1LL * i * i));
    return ret;
}
void init() {
    mu[1] = 1;
    for(int i = 2; i < maxn; ++i) {
        if(!mark[i]) {
            p[++p[0]] = i;
            mu[i] = -1;
        }
        for(int j = 1; j <= p[0] && i * p[j] < maxn; ++j) {
            mark[i * p[j]] = 1;
            if(i % p[j] == 0) break;
            mu[i * p[j]] = -mu[i];
        }
    }
}
ll g(int n) {
    ll ret = 0;
    for(int i = 1, j; i <= n; i = j + 1) {
        j = n / (n / i);
        ret += 1LL * (j - i + 1) * (n / i);
    }
    return ret;
}
int main() {
    init();
    int T; scanf("%d", &T);
    while(T--) {
        scanf("%d", &n);
        ll ans = 0, now = 0, pre = 0;
        for(int i = 1, j; i <= n; i = j + 1) {
            j = n / (n / i);
            now = f(j);
            ans += 1LL * g(n / i) * (now - pre);
            pre = now;
        }
        printf("%lld\n", ans);
    }
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/19992147orz/p/11406882.html