跳转至

P1001 最大公约数与最小公倍数问题

洛谷 P1029 [NOIP 2001 普及组] 最大公约数和最小公倍数问题

题解

显然有 \(x_0 y_0 = PQ\),只需枚举 \(x_0 y_0\) 的因数即可。

可以发现,一个正整数 \(a\) 的因数是关于 \(\sqrt{a}\) 对称的,因为超过 \(\sqrt{a}\)\(a\) 的因数 \(x\) 一定可以存在一个小于 \(\sqrt{a}\) 的正整数 \(y\),使得 \(xy = a\)。那么只需枚举小于等于 \(\sqrt{x_0 y_0}\) 的因数即可得到 \(x_0 y_0\) 的所有因数,这部分的时间复杂度是 \(O(\sqrt{x_0 y_0})\)

参考代码
#include <bits/stdc++.h>
using ll = long long;
using namespace std;

int x, y;

ll gcd(ll a, ll b){
    if(a % b == 0)
        return b;
    return gcd(b, a % b);
}

signed main(){
    ios::sync_with_stdio(false), cin.tie(0);
    cin >> x >> y;
    ll tmp = x * y, cnt = 0;
    for(ll i = x; i <= tmp; i += x){
        if(tmp % i != 0)
            continue;
        ll j = tmp / i;
        if(i * j / gcd(i, j) == y)
            cnt++;
    }
    cout << cnt;

    return 0;
}