[莫比乌斯反演]LibreOJ 528题解

update 2025.5.18 看不懂自己之前写的什么玩意,式子重新写了一遍qwq

看了很多题解没看明白,都是只丢了个结论,因此决定自己写一篇……

题意: 求 \(\sum_{i=1}^{N} \sum_{j=1}^{M}\mu^2(\gcd(i,j))\) 模上 998244353 。

首先推式子,比较套路:

\[\sum_{i=1}^{N} \sum_{j=1}^{M}\mu^2(\gcd(i,j)) \]

\[= \sum_{d=1}^{N}\sum_{i=1}^{N}\sum_{j=1}^{M}\mu^2(d)[d = \gcd(i,j)] \]

\[= \sum_{d=1}^{N}\sum_{i=1}^{N/d}\sum_{j=1}^{M/d}\mu^2(d)[\gcd(i,j) = 1] \]

\[= \sum_{d=1}^{N}\mu^2(d)\sum_{i=1}^{N/d}\sum_{j=1}^{M/d}\sum_{k\mid i,k\mid j}{}{\mu(k)} \]

\[= \sum_{d=1}^{N}\mu^2(d)\sum_{k=1}^{N/d}\mu(k)\lfloor\frac{N}{dk}\rfloor\lfloor\frac{M}{dk}\rfloor \]

\[T = dk \]

\[= \sum_{T=1}^{N}\lfloor\frac{N}{T}\rfloor\lfloor\frac{M}{T}\rfloor\sum_{d\mid T}^{}\mu^2(d)\mu(\frac{T}{d}) \]

我们先抛开前面不谈,看后面这一坨。 这个式子符合狄利克雷卷积形式,显然是一个积性函数。设这个积性函数为

\[S(x) = \sum_{d\mid x}^{}\mu^2(d)\mu(\frac{x}{d}) \]

那么答案就是

\[\sum_{T=1}^{N}S(T)\lfloor\frac{N}{T}\rfloor\lfloor\frac{M}{T}\rfloor \]

我们现在分析一下这个不和谐的 \(S\) 函数。

对于单个的质数,看式子的内容,很显然 \(d\) 取 1 和自身,算出来值是 0。

对于一堆质数乘起来,通过积性函数的性质,也能的出来值是 0。

对于最高幂次等于 2,但是存在幂次为 1 的项,如 \(S(2 \times 3^2 \times 5^2)\) ,这式子由于积性函数性质就可以表示成 \(S(2) \times S(3^2 \times 5^2)\) 的形式,然后 \(S(2)\) 这种刚刚说了得 0,所以这种情况算出来也是 0。

对于最高幂次超过 2,算出来值也是 0 ,因为通过鸽笼原理,\(\mu^2(d)\)\(\mu(\frac{T}{d})\) 总有一个是 0。

唉!我们发现,只剩下一种情况啦。就是所有幂次都是 2 的情况。也就是说 \(S(x)\) 只在 x 是幂次为 2 的质数的乘积的时候才不是 0。这个时候我们再从式子的内容解析。\(\sum_{d\mid x}^{}\mu^2(d)\mu(\frac{x}{d})(x\in perfect square)\) 中,显然 d 只能取 \(\sqrt x\) 时才不为 0。 这个时候的值代入就能知道,式子的值是 \(\mu(d) = \mu (\frac{x}{d})(d = \sqrt x)\)

于是分析完成!所以

\[S(x) = \begin {cases} \mu(\sqrt x) & x\in perfectsquare\\ \\ 0 & x \in (others) \end{cases} \]

所以我们改成枚举 \(\sqrt T\) 的值,再带回到答案中。

\[=\sum_{T=1}^{\sqrt N}{\mu(T)}\lfloor\frac{N}{T ^ 2}\rfloor\lfloor\frac{M}{T^2}\rfloor \]

然后复杂度就对了,做一个\(O(\sqrt{N})\)的预处理和\(O(\sqrt{N})\)的整除分块就可以啦!

#include <bits/stdc++.h>

#define mod 998244353
#define N 4000007
#define qwq return 0
#define int long long

using namespace std;
bool isprime[N];
vector<int> prime;
int mu[N], n, m;
void init() {
    mu[1] = 1;
    for (int i = 2; i <= N; ++i) {
        if (!isprime[i]) {
            prime.push_back(i);
            mu[i] = -1;
        }
        for (int x : prime) {
            if (i * x > N) 
                break;
            isprime[i * x] = true;
            if (i % x == 0) {
                break;
            }
            mu[i * x] = -mu[i];
        }

        mu[i] = mu[i - 1] + mu[i];
    }
}

signed main() {
    init();
    cin >> n >> m;
    int ans = 0;

    for (int i = 1, j ; i * i <= min(n, m) ; i = j + 1) {
        j = sqrt(min(n / (n / (i * i)), m / (m / (i * i))));
        ans = (ans + (mu[j] - mu[i - 1] + mod) % mod * ((n / (i * i)) % mod) % mod * ((m /
                (i * i)) % mod) % mod) % mod;
    }

    cout << ans;
    qwq;
}
posted @ 2025-03-02 16:43  「癔症」  阅读(15)  评论(0)    收藏  举报