1 条题解

  • 0
    @ 2026-5-9 10:09:01

    题解文字教学

    已知两个正整数 x0,y0x_0, y_0,求满足 gcd(P,Q)=x0\gcd(P,Q)=x_0lcm(P,Q)=y0\operatorname{lcm}(P,Q)=y_0 的正整数对 (P,Q)(P,Q) 的个数。

    利用性质:$\gcd(P,Q) \times \operatorname{lcm}(P,Q) = P \times Q$,可得 PQ=x0y0P \cdot Q = x_0 y_0
    P=x0a,  Q=x0bP = x_0 \cdot a,\; Q = x_0 \cdot b,则要求 gcd(a,b)=1\gcd(a,b)=1ab=y0x0a \cdot b = \dfrac{y_0}{x_0}
    y0modx00y_0 \bmod x_0 \neq 0,则无解,输出 00。否则令 s=y0x0s = \dfrac{y_0}{x_0},问题转化为求满足 asa \mid sgcd(a,s/a)=1\gcd(a, s/a)=1 的正整数 aa 的个数。由于每一个 aa 唯一确定 b=s/ab = s/a,从而确定一对 (P,Q)(P,Q),因此统计这样的 aa 的个数就是答案((P,Q)(P,Q) 有序,枚举 aa 已包含顺序)。

    实现时,只需枚举 ss 的因子,对每个因子 ii 判断其与对应因子 j=s/ij = s/igcd\gcd 是否为 11。若 gcd(i,j)=1\gcd(i,j)=1,则当 iji \neq j 时会计入两对(a=ia=ia=ja=j 各一对),当 i=ji = j 时计入一对。最终累加即得答案。时间复杂度 O(s)O(\sqrt{s}),完全可行。


    参考代码

    #include <bits/stdc++.h>
    using namespace std;
    
    int gcd(int a, int b) {
        while (b) {
            int t = a % b;
            a = b;
            b = t;
        }
        return a;
    }
    
    int main() {
        int x, y;
        cin >> x >> y;
        if (y % x != 0) {
            cout << 0 << endl;
            return 0;
        }
        int s = y / x;
        int ans = 0;
        for (int i = 1; i * i <= s; ++i) {
            if (s % i == 0) {
                int j = s / i;
                if (gcd(i, j) == 1) {
                    ans++;
                    if (i != j) ans++;
                }
            }
        }
        cout << ans << endl;
        return 0;
    }
    
    • 1

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

    信息

    ID
    29
    时间
    1000ms
    内存
    125MiB
    难度
    3
    标签
    递交数
    9
    已通过
    5
    上传者