1 条题解

  • 1
    @ 2024-9-23 18:08:42

    定理:

    gcd(a,b)=gcd(b,amodb)\text{gcd}(a, b) = \text{gcd}(b, a \mod b)

    证明:

    1. amodb=akba \mod b = a - k \cdot b,其中 k=a/bk = \lfloor a / b \rfloor(向下取整)。

    2. dd(a,b)(a, b) 的公约数:

      • 则知 dad \mid adbd \mid b
      • 则易知,d(akb)d \mid (a - k \cdot b),即 dd 也是 (b,amodb)(b, a \mod b) 的公约数。
    3. dd(b,amodb)(b, a \mod b) 的公约数:

      • 则知 dbd \mid bd(akb)d \mid (a - k \cdot b)

      • 则,d(akb+kb)d \mid (a - k \cdot b + k \cdot b),即 dad \mid a

      • 因此,dd 同时整除 aabb,所以 dd 也是 (a,b)(a, b) 的公约数。

    4. 综上所述,(a,b)(a, b) 的公约数集合与 (b,amodb)(b, a \mod b) 的公约数集合相同,因此它们的最大公约数也相同。

    证毕。

    参考答案:

    #include<iostream>
    using namespace std;
    typedef long long LL;
    LL gcd(LL a, LL b)
    {
        return b ? gcd(b, a % b) : a;
    }
    int main()
    {
        LL a, b;
        cin >> a >> b;
        cout << gcd(a, b) << endl;
    
        return 0;
    }
    
    • 1

    信息

    ID
    5377
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    10
    已通过
    4
    上传者