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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37867156/article/details/83066484

题目描述

输入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;
}

猜你喜欢

转载自blog.csdn.net/qq_37867156/article/details/83066484
今日推荐