zoukankan      html  css  js  c++  java
  • [BZOJ1101&BZOJ2301][POI2007]Zap [HAOI2011]Problem b|莫比乌斯反演

    对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd(x,y)=d。

      我们可以令F[n]=使得n|(x,y)的数对(x,y)个数

      这个很容易得到,只需要让x,y中都有n这个因子就好了,也就是[a/n]*[b/n]个数对(向下取整)

      然后设题中所要求的为f[n],很容易得知,F[n]=∑f[d](n|d)

      莫比乌斯反演可以得到f[n]=∑μ(d/n)F[d](n|d)

      这样是O(n),然而数据范围5*10^4显然不能通过

      f[n]=∑μ(d/n)[a/d][b/d](n|d)

      这个式子停止的条件是a/d=0或者b/d=0

      令m=min(a/n,b/n)

      f[n]=∑μ(i)[a/(i*n)][b/(i*n)](1<=i<=m)

      然后可以通过一些方法证明[a/(i*n)] = [[a/i]/n]

      毕竟弱.证明得这么差..

      证明:[n/(a*b)]=[[n/a]/b]

      设[n/a]=(n-x)/a (x<a)

      设[[n/a]/b]=((n-x)/a-y)/b (y<b) 

      [[n/a]/b]=(n-x-ay)/ab,设[n/(a*b)]=(n-e)/ab

      设二者不等,即(n-x-ay)/ab+t=(n-e)/ab(t>=1)

      x+ay=e+tab

      x-e=a(tb-y)

      ∵a>0,b>y ∴a(tb-y)>0

      而x是n/a的余数,e是n/ab的余数,显然e>=x,x-e<=0,矛盾

      所以[a/(i*n)] = [[a/i]/n]

      然后直接枚举每一个可能的[a/(i*n)][b/(i*n)]的取值就好了

      莫比乌斯函数用前缀和累计

      BZOJ1101交了22发...创了个人记录啊..

      Pas错误不明..后来改用C++,是因为!i mod prime[j]这里没有加括号..用==0就不会错了...

      BZOJ2301

      容斥将一个问题拆分成四个子问题即可

      

  • 相关阅读:
    VS2005中Ajax控件作用说明
    DevExpress 2.0 GridControl 使用方法
    主机信息
    sql2005中运用一条sql语句完成数据导出到Excel中
    跟我学做c#皮肤美化
    (转)QT事件传递与事件过滤器
    (转)主成分分析(Principal components analysis)最大方差解释
    这是填充首页的
    (转)C++中extern “C”含义深层探索
    (转)如何配置Qt使用VS2010进行开发
  • 原文地址:https://www.cnblogs.com/mjy0724/p/4481667.html
Copyright © 2011-2022 走看看