您的位置:首页 > 其它

hdu 4497 GCD and LCM 容斥原理

2013-09-27 19:54 453 查看
题意:已知l,g其中g=gcd(x,y,z),l=lcm(x,y,z),问有x,y,z多少种组合使得关系成立。

题解:已知x%g=y%g=z%g=0,l%x=l%y=l%z=0,所以l%g=0。这个可以判定是否存在(x,y,z)符合条件。

又l/g=p1^a1*p2^a2*p3^a3*...pk^ak.(pi为素数)

x/g=p1^b1*p2^b2*...*pk^(bk);同理得到y/g,z/g,指数为ci和di.

所以min(bi,ci,di)=0,不然最大公约数是pi^min(ai,bi,ci)*g>g,同理得到max(bi,ci,di)=ai。

之后就是怎么安排(bi,ci,di),其中一个为0,一个为ai,另一个任意0<=k<=ai。使用容斥原理求:

对pi指数的所有可能方案数:fi=所有的方式(ai+1)^3-不含0的情况ai^3-不含ai的情况ai^3+重复删去的即不含0,也不含ai的情况(ai-1)^3

所以答案就是ans=∑fi(1<=i<=k,fi=(ai+1)^3-2*ai^3+(ai-1)^3)

耗时:15MS

#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int g,l,i,j,k,t,n,m,ans=1;
        cin>>g>>l;
        if(l%g!=0){cout<<0<<endl;continue;}//不成立条件
        n=l/g;
        m=(int)sqrt(n+0.5);
        for(i=2;i<=m;i++)
        {
            if(n%i==0)
            {
                t=0;
                while(n%i==0)
                {
                    n=n/i;
                    t++;
                }
                ans*=(t+1)*(t+1)*(t+1)-2*t*t*t+(t-1)*(t-1)*(t-1);//容斥原理
            }
        }
        if(n>1)
            ans*=6;//指数为1
        cout<<ans<<endl;
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: