题目描述
输入2个正整数x0,y0(2≤x0<100000,2≤y0<=1000000),求出满足下列条件的P,Q的个数
条件:
-
P,Q是正整数
-
要求P,Q以x0为最大公约数,以y0为最小公倍数.
试求:满足条件的所有可能的2个正整数的个数.
输入输出格式
输入格式:
2个正整数x0,y0
输出格式:
1个数,表示求出满足条件的P,Q的个数
输入输出样例
说明
P,QP,Q有4种
1、3,60
2、15,12
3、12,15
4、60,3
关于这道题,首先要明确一件事:两个正整数的乘积是最大公约数乘以最小公倍数(在这里进行一个并不严谨的证明):
定义两个正整数PQ,他们的最大公约数是x,最小公倍数是y。y就是x*(P/x)*(Q/X),那么再乘一个x,不久等于P*Q吗?
所以,这道题的求解范围就大大地缩小了,我们只需要枚举x的倍数即可,并令相乘等于x*y即可。
但是还是有一个问题:比如样例3 60 按照上述的方法求得10 6是满足条件的解,但是实际上他们的最大公约数是2,所以我们还需要判断最大公约数是否与给出的相等(利用辗转相除法),由于两个数乘积一定,如果最大公约数一定,那么显然最小公倍数一定,所以这是显然成立的。
最后,附上本题代码:
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 int ans; 5 int gcd(int x,int y) 6 { 7 if(x%y==0) 8 { 9 return y; 10 } 11 else 12 { 13 return gcd(y,x%y); 14 } 15 } 16 int main() 17 { 18 int x,y; 19 scanf("%d%d",&x,&y); 20 for(int i=x;i<=x*y;i+=x) 21 { 22 if((x*y)%i==0&&gcd(i,(x*y)/i)==x) 23 { 24 ans++; 25 } 26 } 27 printf("%d",ans); 28 return 0; 29 }