洛谷 P1029 最大公约数和最小公倍数问题
链接
https://www.luogu.org/problem/P1029
题目
题目描述
输入2个正整数x0,y0(2≤x0<100000,2≤y*0<=1000000),求出满足下列条件的P,Q的个数
条件:
- P,Q是正整数
- 要求P,Q*以x0为最大公约数,以y0为最小公倍数.
试求:满足条件的所有可能的2个正整数的个数.
输入格式
2个正整数x0,y*0
输出格式
1个数,表示求出满足条件的P,Q的个数
输入输出样例
输入 #1
3 60
输出 #1
4
说明/提示
P,Q有4种
1、3,60
2、15,12
3、12,15
4、60,3
思路
题目就是输入x,y,一为最小公约数,一为最大公倍数,求存在的pq对数。
p=x*k1,q=x*k2,y=x*k1*k2,k1k2互质,这就是总结之后的关系,x*y=p*q,将基于这个公式和辗转相除法来计算。
输入xy,寻找pq乘积为xy的对,之后判断这对pq的最大公约数是不是x,是的话结果就加二(一正一反)。最后,考虑到x=y,比如3,3,若如此,结果加一。
代码
#include<iostream>
using namespace std;
int gcd(int a,int b)
{
if(b!=0)
return gcd(b,a%b);
return a;
}
int main()
{
int x,y;
cin>>x>>y;
int sum=0;
for(int i=1;i*i<x*y;i++)
{
if((x*y)%i==0 && gcd(i,(x*y)/i)==x)
sum++;
}
sum = sum*2;
if(x==y)
sum++;
cout<<sum;
return 0;
}