最大公约数和最小公倍数问题

题目描述

输入2个正整数x0,y0(2x0<100000,2y0<=1000000),求出满足下列条件的P,Q的个数

条件:

  1. P,Q是正整数

  2. 要求P,Qx0为最大公约数,以y0为最小公倍数.

试求:满足条件的所有可能的2个正整数的个数.

输入输出格式

输入格式:

2个正整数x0,y0

输出格式:

1个数,表示求出满足条件的P,Q的个数

输入输出样例

输入样例#1: 复制
3 60
输出样例#1: 复制
4

说明

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 }
原文地址:https://www.cnblogs.com/yufenglin/p/10308948.html