[莫比乌斯反演]LibreOJ 528题解
update 2025.5.18 看不懂自己之前写的什么玩意,式子重新写了一遍qwq
看了很多题解没看明白,都是只丢了个结论,因此决定自己写一篇……
题意: 求 \(\sum_{i=1}^{N} \sum_{j=1}^{M}\mu^2(\gcd(i,j))\) 模上 998244353 。
首先推式子,比较套路:
我们先抛开前面不谈,看后面这一坨。 这个式子符合狄利克雷卷积形式,显然是一个积性函数。设这个积性函数为
那么答案就是
我们现在分析一下这个不和谐的 \(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)\)。
于是分析完成!所以
所以我们改成枚举 \(\sqrt T\) 的值,再带回到答案中。
然后复杂度就对了,做一个\(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;
}