【GDOI2016】互补约数 题解

【题目大意】

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,相当于 j ij已经同时约去了 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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值