CF1884D Counting Rhyme 题解

Problem - D - Codeforces

Counting Rhyme - 洛谷

法1:

  • 我们之前肯定看过这样一道非常经典的题:

  • ai 中有多少对 (i,j),满足 gcd(ai,aj)=1

    n106

  • 这题是莫反板子题,但显然可以不用莫反做。先不说这题怎么做,我们发现这道题和 CF1884D 的不同之处在于这题 gcd 可以为一些特殊的值

  • 我们先考虑原题 O(n2) 怎么做,我们可以枚举 (i,j),记录 fi 表示 a 中是否存在 i 的因子,不存在为 1,存在为 0

  • 则答案为:

  • i=1nj=i+1nfgcd(ai,aj)

  • 然后考虑怎么优化成 O(nlogn),发现 ain,因此要用到一个非常经典的思路:改变枚举顺序

  • 我们改为枚举 gcd(ai,aj),则答案变为:

  • g=1nfg×numg

  • 其中 numg 表示 gcd=g 的数对个数。然后求 numg 的过程就变成了上面那个问题

  • 我们考虑数论容斥:设 gi 表示 i|gcd(ax,ay) 的个数,然后再容斥即可

  • 复杂度 O(nlnn)


法2:

  • 我们之前肯定看过这样一道非常经典的题:

  • 求 a_i 中有多少对 (i,j),满足 \gcd(a_i,a_j)=1

    n \leq 10^6

  • 这题是莫反板子题,因此这题我们也考虑暴力莫反

  • 现在是推式子时间!

  • biai 的桶

  • (1)i=1nj=i+1nk|ai,k|aj[bk=0]=i=1nj=i+1nk|ai,k|aj[bk=0]

  • 然后转为枚举实际的值,而不是编号

  • (2)i=1nj=1nbibjfgcd(i,j)=i=1nj=1nd=1nbibjfd[gcd(i,j)=d](3)=d=1ni=1ndj=1ndbidbjdfd[gcd(i,j)=1](4)=d=1ni=1ndj=1ndbidbjdfdk|i,k|jμ(k)(5)=d=1nfdk=1ndμ(k)i=1ndkj=1ndkbidkbjdk(6)=d=1nfdk=1ndμ(k)(i=1ndkbidk)2(7)=T=1n(i=1nTbiT)2d|Tfdμ(Td)

  • 此时前面的平方可以 O(nlnn) 处理,去除这一项后剩余的是一个狄利克雷卷积的形式,可以做到 O(nlnn),故最终复杂度 O(nlnn)

  • 注意:这么算的是没有顺序的,但因为 (i,i) 不可能成为答案,要注意答案除以 2

posted @   FOX_konata  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示