luogu-P1029.最大公约数和最小公倍数问题

88 阅读1分钟
P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题 - 洛谷
gcd() 求最大公约数函数
思路
  • 应该都知道最大公约数与最小公倍数的乘积就是原两个数的积
  • x=yx=y 那么满足要求的个数就为一个
  • 只需要遍历从 xxsqrt(xy)sqrt(x*y) 得到满足条件的个数,最后在乘二就能得到结果
Code
#include<bits/stdc++.h>
using namespace std;
#define ll long long

int main(){
	ll x,y,sum,ans=0;
	cin >> x >> y;
	if(x==y){
		cout << 1;
		return 0;
	}
	sum=x*y;
	for(ll i=x;i<=sqrt(sum);++i){
		ll z=sum/i;
		if(i*z==sum)
			if(__gcd(i,z)==x)
				ans+=2;
	}
	cout << ans;
	return 0;
}
题目

题目描述

输入两个正整数 𝑥0,𝑦0𝑥0,𝑦0,求出满足下列条件的 𝑃,𝑄𝑃,𝑄 的个数:

  1. 𝑃,𝑄𝑃,𝑄是正整数。
  2. 要求 𝑃,𝑄𝑃,𝑄 以 𝑥0𝑥0 为最大公约数,以 𝑦0𝑦0 为最小公倍数。

试求:满足条件的所有可能的 𝑃,𝑄𝑃,𝑄 的个数。

输入格式

一行两个正整数 𝑥0,𝑦0𝑥0,𝑦0

输出格式

一行一个数,表示求出满足条件的 𝑃,𝑄𝑃,𝑄 的个数。

输入输出样例

输入 #1

3 60

输出 #1

4

说明/提示

𝑃,𝑄𝑃,𝑄 有 44 种:

  1. 3,60。
  2. 15,12。
  3. 12,15。
  4. 60,3。

对于 100% 的数据,2𝑥0,𝑦01052≤𝑥0,𝑦0≤10^5