【HAOI2011】Problem b(莫比乌斯反演+分块儿)

来源:互联网 发布:芒果tv网络电视下载 编辑:程序博客网 时间:2024/05/20 15:38

Problem

给定a,b,c,d,k,求a<=x<=b,c<=y<=d,gcd(x,y)=k的对数.

a,b,c,d,k<=50000

Solution

  • 转化模型

    • 我们先把问题转化为求

      • Ans(b,d)Ans(a1,d)Ans(b,c1)+Ans(a1,c1)
    • 然后,现在只需求(1<=x<=n,1<=y<=m)gcd(x,y)

  • 基本思路:

    • f(k)表示1<=x<=n,1<=y<=m,且gcd(x,y)=k的数对个数.

    • g(k)表示1<=x<=n,1<=y<=m,且k|gcd(x,y)的数对个数.

    • 显然,有

      g(k)=d=1nkf(kd)

    • g(k)=nkmk

    • 所以有

      f(ki)=g(ki)j=2nkif(kij)

    • 但这样的时间复杂度还不够优,i<=|nk|,所以单次询问时间复杂度为

      i=1nk(nki1)

  • 此时,我们考虑莫比乌斯反演.

  • 根据

    g(k)=d=1nkf(kd)=nkmk
    f(k)=d=1nkμ(d)nkdmkd

  • 根据http://blog.csdn.net/algor_pro_king_john/article/details/78396194的“一个变形”即可以证明.

  • 所以这样子,单次询问时间复杂度变为O(nk).

  • 再次考虑优化
    这里写图片描述

  • 可以发现,第一行的取值不会超过2nk,第二行取值不会超过2mk.

  • 可以运用分块,每次找到完全相同的一段进行计算.

  • 处理一个μ的前缀和即可.

  • 单次询问时间复杂度变为O(n+m)