当前位置: 代码迷 >> 综合 >> 洛谷【 P1029 最大公约数和最小公倍数问题】
  详细解决方案

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

热度:55   发布时间:2023-11-28 06:45:50.0

题目描述

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

条件:

  1. P,Q是正整数

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

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

输入输出格式

输入格式:

2个正整数x0,y0?

输出格式:

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

输入输出样例

输入样例#1: 

3 60

输出样例#1: 

4

说明

P,Q有4种

1、3,60
2、15,12
3、12,15
4、60,3

题解:gcd(a, b) * lcm(a, b) = a*b; 根据题目条件可得 P*Q = x0 * y0. 逐一判断 x0, y0 中较小的那个数的倍数即可。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#define ll long long
#define mod 100000000
using namespace std;
const int maxn = 1000010;
ll gcd(ll a, ll b){return b ? gcd(b, a%b) : a;
}
ll lcm(ll a, ll b){return a*b/gcd(a, b);
}
int main()
{int x0, y0;cin >> x0 >> y0;ll s = x0*y0;int m = min(x0, y0);int cnt = 0;for(ll i = m; i <= s/m*m; i += m){if(s % i == 0){if(gcd(i, s/i) == x0 && lcm(i, s/i) == y0)cnt++;}}cout << cnt << endl;return 0;
}

 

  相关解决方案