【GDOI2016】互补约数 题解

本文针对一道复杂的数学算法题提供了解析,介绍了不同难度级别的解题思路。从暴力枚举到利用Mobius反演进行高效计算,详细阐述了如何求解特定形式的数论问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【题目大意】

i=1nd|igcd(d,id)

【20%】n<=105

         暴力枚举i,然后根号枚举d
         时间复杂度O(nn)

【50%】n<=107

         双sigma带gcd的形式考虑反演。

i=1nd|igcd(d,id)

=d=1ndf(d)f(d)=i=1nj|i(gcd(j,ij)==d)

         接下来我们考虑如何快速求f(d),方法众多,这里介绍一种非Mobius的方法。
         由于i分解成两个因数之后,两个因数都要含因子d,因此i本身应该是d2的倍数。所以我们不枚举i,而是直接枚举ti=id2,相当于jij已经同时约去了d。所以
f(d)=ti=1nd2td|ti(gcd(td,titd)==1)

         我们现在其实是把ti分解成两个因数,然后两个因数互质。考虑将ti分解质因数,那么对于ti的同一种质因子,td要么将它全选,要么全不选。因此第二个sigma只与ti的质因数种类数有关。设g[ti]表示ti的质因数种类数,则
f(d)=ti=1nd22g[ti]

         我们只需预处理g数组即可。
         时间复杂度主要在预处理上,所以是O(n)。(注意那个nd2,由于分母以平方速度增长,所以整个分数下降速度是很快的)

【100%解法1】n<=1011

         上述解法的瓶颈在于g[ti]不好求,因为ti最大会达到n,预处理存不下,现场求又慢。所以对于f(d)我们要换一种求法。
         事实上,求f(d)是Mobius反演的经典问题。

f(d)=i=1nj|i(gcd(j,ij)==d)

=i=1nj=1n(gcd(i,j)==d)ij<=n

         m=nd2,则上式
=i=1mj=1m(gcd(i,j)==1)ij<=m

=D=1mμ(D)t=1mD2mD2t

         总式为
d=1ndD=1nd2μ(D)t=1nd2D2nd2D2t

         接下来用《莫比乌斯反演(宋新波)》里的一种变形。(参考wc2016课件)
         T=dD,则原式为
T=1nd|Tdμ(Td)t=1nT2nT2t

         事实上如果T>n,则第三个sigma无意义。所以原式为
T=1nG(T)t=1nT2nT2tG(T)=d|Tdμ(Td)

         显然G数组是可预处理的,第二个sigma可以分块解决。
         时间复杂度:预处理为O(nlog(n)),最终式子求值为O(n?)?为一个不是很大的常数。(注意那个nT2,由于分母以平方速度增长,所以整个分数下降速度是很快的)

【100%解法>=2】n<=1011

         更多高超的反演姿势请自行脑补。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值