题目描述 Description
输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数
条件:
1.P,A是正整数
2.要求P,Q以x0为最大公约数,以y0为最小公倍数.
试求:满足条件的所有可能的两个正整数的个数.
条件:
1.P,A是正整数
2.要求P,Q以x0为最大公约数,以y0为最小公倍数.
试求:满足条件的所有可能的两个正整数的个数.
输入输出格式 Input/output
输入格式:
二个正整数x0,y0
输出格式:
一个数,表示求出满足条件的P,Q的个数
二个正整数x0,y0
输出格式:
一个数,表示求出满足条件的P,Q的个数
输入输出样例 Sample input/output
样例测试点#1
输入样例:
3 60
输出样例:
4
思路:这题有个小技巧,由于有一半的答案只是将前面的倒了过来,故可以只枚举到根号下x*y,再将答案*2(最小公倍数就是两个数相乘再除以最大公约数 )。
这题要用到递归来求最大公约数,辛亏数据不大(*^__^*) ,或者也可以用辗转相除法来求最大公约数!
代码如下:
1 #include<stdio.h> 2 #include<math.h> 3 int ojld(int i,int j)//最大公约数(递归) 4 { 5 if(i==0)return j; 6 ojld(j%i,i); 7 } 8 int main() 9 { 10 int x,y,q,num=0,k; 11 int i; 12 scanf("%d%d",&x,&y); 13 k=x*y; 14 q=sqrt(k); 15 for(i=x;i<=q;i++) 16 { 17 if(k%i==0&&ojld(i,k/i)==x) num++; 18 } 19 printf("%d ",num*2); 20 return 0; 21 }
下面是辗转相除法求最大公约数:
1 #include<stdio.h> 2 int main() 3 { 4 int m, n, a, b, c; 5 scanf("%d%d",&a,&b); 6 m=a; 7 n=b; 8 while(b!=0) // 余数不为0,继续相除,直到余数为0 9 { 10 c=a%b; 11 a=b; 12 b=c; 13 } 14 printf("%d ",a);//最大公约数 15 printf("%d ",m*n/a);//最小公倍数 16 return 0; 17 }
过程如下: