【莫比乌斯】HDU 4746 Mophues

通道:http://acm.hdu.edu.cn/showproblem.php?pid=4746

题意:定义f(x) = x分解质因数出来的因子个数,如 x = p0 * p0 * p0 * p1 * p2,则f(x) = 5,特殊的, f(1) = 0,求 i = [1..n], j = [1..m] 组成的n*m组(i, j)对中,有多少组f( gcd(i,j) ) <= p

思路:设A(d):gcd(a, b)=d的有多少种

     设B(j): gcd(a, b)是j的倍数的有多少种,易知B(j) = (n/j)*(m/j)

     则由容斥原理得:(注:不同行的μ是不相同的,μ为莫比乌斯函数)

     A(1) = μ(1)*B(1) + μ(2)*B(2) + μ(3)*B(3) + ... + μ(p1*p2...)*B(p1*p2...)

     A(2) = μ(1)*B(1*2) + μ(2)*B(2*2) + μ(3)*B(3*2) + ... + μ(p1*p2..)*B(p1*p2..*2)

     ...

     A(d) = μ(1)*B(1*d) + μ(2)*B(2*d) + μ(3)*B(3*d) + ... + μ(p1*p2..)*B(p1*p2..*d)

 

     ans = A(1)+A(2)+...+A(d) = F(1)*B(1) + F(2)*B(2) + ... + F(p1*p2..)*B(p1*p2..)

     于是可以枚举公约数i{表示A(i)},利用筛法找出i的倍数j,i对B(j)的贡献系数为:F(j)+=μ(j/i)

     总之,求出B(j)的总贡献系数F(j)即可得答案:F(1)*B(1)+F(2)*B(2)+...+F(n)*B(n)

     上面没有限制gcd的素因子个数,要限制其实不难,给系数加多一维即可:

     F(d)(p)表示:素因子个数<=p时,对B(d)的贡献系数

   

     分块加速思想

     你可以再纸上模拟一下:设d在[i, n/(n/i)]的区间上,则该区间内所有的n/d都是一样的。

代码:https://github.com/Mithril0rd/Rojo/blob/master/hdu4746.cpp

TAG:mobius

posted @ 2014-11-05 16:15  mithrilhan  阅读(156)  评论(0编辑  收藏  举报