高中生活 解题报告

upd 2024.2.21

更改了时间复杂度问题。

题目描述

给出 n,m ,求:

i=1nj=1mlcm(i,j)gcd(i,j)

n,m106 。多测,数据组数 T100

思路点拨

分解 lcm :

i=1nj=1m(ijgcd(i,j))gcd(i,j)

可以转化为两个问题:

i=1nj=1m(ij)gcd(i,j)

i=1nj=1mgcd(i,j)gcd(i,j)

分子部分看起来比较简单,并且可以拆分为 i,j 两个独立的问题,我们拿 i 举例子:

i=1nj=1migcd(i,j)

i=1nij=1mgcd(i,j)

先考虑幂次的式子,这个莫比乌斯反演感觉不那么方便:

j=1mgcd(i,j)=j=1md|j,d|iφ(d)=d|iφ(d)md

带回原式

i=1nid|iφ(d)md

发现 md 阻止了快速运算,转而枚举 d:

d=1nd|iiφ(d)md=d=1n(d|ii)φ(d)md

其中关于 d|ii=fac(nd)×dnd

带回原式得到:

d=1n(fac(nd)×dnd)φ(d)md

这个时候,如果 ndmd 一样就好了,可以使用富比尼定理在 O(n) 级别的时间进行枚举。对于一段连续值域的 d ,我们需要计算 d=lrdnd ,因为 nd 是一样的,所以等价于 (d=lrd)nd ,可以使用阶乘和逆元求出 O(logmod) 求出。

我们完成了分子的计算,单次花费 O(nlogmod) ,是一个可以接受的时间。

考虑分母部分:

i=1nj=1mgcd(i,j)gcd(i,j)

显然可以枚举一个 gcd

d=1n(dd)i=1nj=1m[gcd(i,j)=d]

考虑幂次的部分:

i=1nj=1m[gcd(i,j)=d]=i=1ndj=1md[gcd(i,j)=1]

记这个式子的值为 sum(nd,md) ,所以:

sum(n,m)=i=1nj=1m[gcd(i,j)=1]

i=1nj=1md|i,d|jμ(d)

枚举 d

d=1nμ(d)ndmd

这个可以简单整除分块一下,时间 O(n)

我们带回原式:

d=1n(dd)sum(nd,md)

整除分块套整除分块,时间复杂度大约为 O(n0.0.66) 单次,大概吧。

所以时间复杂度可以在 O(nlogmod) 预处理的情况下做到单次 O(n0.66+n0.5logmod) 。应该是一个可以通过的时间。

posted @   Diavolo-Kuang  阅读(20)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示