您的位置:首页 > 其它

HDU 4497 GCD and LCM(素因子分解+组合数学)

2015-09-04 08:31 337 查看
Description

已知lcm,gcd其中gcd=gcd(x,y,z),lcm=lcm(x,y,z),问有x,y,z多少种组合使得关系成立( (1,3,2)和(1,2,3)是不同解 )

Input

第一行为用例组数T,每组用例占一行包括两个整数gcd和lcm

Output

对于每组用例,输出解的个数

Sample Input

2

6 72

7 33

Sample Output

72

0

Solution

显然若lcm%gcd!=0时无解,令n=lcm/gcd,对n质因数分解后得到n=p1^k1*p2^k2*…*pm^km,那么必然有

a/g=p1^a1*p2^a2*…*pm^am

b/g=p1^b1*p2^b2*…*pm^bm

c/g=p1^c1*p2^c2*…*pm^cm

所以对于任意i(1<=i<=m),都有min(ai,bi,ci)=0,max(ai,bi,ci)=ki,当ai,bi,ci三者之中居中者取1~ki-1时,总共有6*(ki-1)种情况,当取0或者ki时,有2*3=6中情况,所以对于每个i,都有6*(ki-1)+6=6*ki种情况,所以枚举n的所有质因子幂级数k每次累乘6*k即可

Code

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
ll lcm,gcd;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld",&gcd,&lcm);
ll n=lcm/gcd;
ll ans=lcm%gcd?0:1;//lcm%gcd!=0显然无解
for(ll i=2;i*i<=n;i++)//对n分解质因数
{
ll m=0;//m是n某一素因子的幂级数
if(n%i)continue;
while(n%i==0)
m++,n/=i;
ans=ans*6*m;
}
if(n!=1)//n仍然不等于1说明此时n是一个大素数
ans*=6;
printf("%lld\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: