【luogu P3327】约数个数和(莫比乌斯反演)

约数个数和

题目链接:luogu P3327

题目大意

给你 n,m 要你求 ∑i=1~n∑j=1~m d(ij),d 是约数个数。
多组数据。

思路

首先由一个比较神奇的东西:
d(ij)=x|iy|j[gcd(x,y)=1]

这里证明一下:
先看我们可以只看一个质数的部分。
假设它的因子的出现次数是 xi 中有 a 个,j 中有 b 个,那 ij 中就是 a+b 个。

如果 xa,那它在 i 中会出现被数到。
那如果 x>a,我们可以在 j 中数一个 xa 就表示满了之后再我那个这边的个数。

所以是对的。

然后就来化式子:
i=1nj=1md(ij)
=i=1nj=1mx|iy|j[gcd(x,y)=1]
=x=1ny=1mi=1nxj=1my[gcd(x,y)=1]
=x=1ny=1mnxmy[gcd(x,y)=1]
=i=1nj=1mnimj[gcd(i,j)=1]

然后莫反。
fx=i=1nj=1mnimj[gcd(i,j)=x]

gi=x|ifi=i=1nj=1mnimj[x|gcd(i,j)]
=i=1nj=1mnimjx|i,x|j1
=xi=1nxj=1mxnixmjx

fi=i|xμ(xi)gx
f1=1|xμ(x1)gx=i=1min(n,m)μ(i)gi

那询问我们可以预处理 μ 的前缀和然后用数论分块求 gi
(用数论分块预处理 i=1xxi
(然后用数论分块搞 x 的部分)

然后每次询问你就跑一次数论分块 O(n),所以询问的复杂度是 O(Tn) 可以的。

代码

#include<cstdio> #include<iostream> #define ll long long using namespace std; int T, n, m, prime[50001]; ll f[50001], ans, miu[50001]; bool np[50001]; int main() { miu[1] = 1; for (int i = 2; i <= 50000; i++) { if (!np[i]) prime[++prime[0]] = i, miu[i] = -1; for (int j = 1; j <= prime[0] && i * prime[j] <= 50000; j++) { np[i * prime[j]] = 1; if (i % prime[j] == 0) {miu[i * prime[j]] = 0; break;} else miu[i * prime[j]] = -miu[i]; } } for (int i = 1; i <= 50000; i++) miu[i] += miu[i - 1]; for (int i = 1; i <= 50000; i++) { int r; for (int l = 1; l <= i; l = r + 1) { r = i / (i / l); f[i] += 1ll * (r - l + 1) * (i / l); } } scanf("%d", &T); while (T--) { scanf("%d %d", &n, &m); ans = 0; if (n > m) swap(n, m); int r; for (int l = 1; l <= n; l = r + 1) { r = min(n / (n / l), m / (m / l)); ans += (miu[r] - miu[l - 1]) * f[n / l] * f[m / l]; } printf("%lld\n", ans); } return 0; }

__EOF__

本文作者あおいSakura
本文链接https://www.cnblogs.com/Sakura-TJH/p/luogu_P3327.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   あおいSakura  阅读(44)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示