您的位置:首页 > 其它

2013年通化邀请赛E题(GCD and LCM 最大公约数最小公倍数关系 )

2013-08-10 19:20 344 查看


2013年通化邀请赛E题(GCD and LCM 最大公约数最小公倍数关系 )

分类: 数论2013-06-29
20:33 131人阅读 评论(0) 收藏 举报

首先我先给出一个他们之间的关系

最大公约数L和最小公倍数G的关系:

1、L%G == 0;

2、设A, B的最大公约数为G, 最小公倍数为L,则:L/G = (A/G)*(B/G)

3、gcd(A/G, B/G) = 1;

本题:

题意:给你三个数x,y,z的最大公约数gcd,最小公倍数lcm . 然后求满足的x,y,z有多少种可能。(1,3,2) 和 (1,2,3)被视为不同

思路:

首先lcm%gcd == 0是必须的,否则无解。然后将tmp = lcm/gcd 进行因式分解。假设其中有一个质因子p1的幂为e1,那么着三个数中至少有一个含有

p1,至少有一个不含p1 。如果都含有p1的话他就被分到最大公约数里面去了,不会在tmp里面,如果不含有p1的话,那么p1就一定不会存在了。

那么对于质因子p1来说 如果有两个含有他的话那么结果为A(3,2)*(e1 - 1) e1 可以分成x ,y (x+y = e1 x!=0 && y != 0) 如果有一个含有它的话那么必定是

含有p1^e1次方。如果不是p1^e1次方的话,那么tmp里面的p1的幂也就不是e1了。

[cpp] view
plaincopy

#include <iostream>

#include <stdio.h>

using namespace std;

typedef long long LL;

int a[550];

int k;

void Solve(LL n)

{

int i,c;k=0;

for(i=2;i*i<=n;i++)

{

if(n%i==0)

{

c=0;

while(n%i==0)

{

c++;

n/=i;

}

a[k++]=c;

}

}

if(n>1)

a[k++]=1;

}

int main()

{

int t;

LL L,G,temp,ans;

scanf("%d",&t);

while(t--)

{

cin>>G>>L;

if(L%G)

{

puts("0");

continue;

}

temp=L/G;

Solve(temp);

ans=1;

for(int i=0;i<k;i++)

ans*=(6*a[i]);

cout<<ans<<endl;

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: