洛谷 P1029 最大公约数和最小公倍数问题

洛谷 P1029 最大公约数和最小公倍数问题

链接

https://www.luogu.org/problem/P1029

题目

题目描述

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

条件:

  1. P,Q是正整数
  2. 要求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;
} 
原文地址:https://www.cnblogs.com/blogxjc/p/11349756.html