1 条题解

  • 2
    @ 2023-9-27 16:44:52

    有些时候确实挺无助的

    此题需要前置知识——扩展欧几里得算法(exgcd)

    #include <bits/stdc++.h>
    #define int long long
    using namespace std;
    
    const int N = 15;
    int a[N],r[N],k;
    
    int exgcd(int a, int b, int &x, int &y)
    {
        if(b == 0)
        {
            x = 1; 
            y = 0;
            return a;
        }
        int ans = exgcd(b, a % b, x, y);
        int t = x;
        x = y;
        y = t - a / b * y;
        return ans;
    }
    
    int crt(int k, int* a, int* r)
    {
        int n = 1, ans = 0;
        for(int i = 1; i <= k; i++) n = n * r[i];
        for (int i = 1; i <= k; i++)
        {
            int m = n / r[i], b, y;
            exgcd(m, r[i], b, y);
            ans = (ans + a[i] * m * b % n) % n;
        }
        return (ans % n + n) % n;
    }
    
    
    signed main()
    {
        scanf("%lld",&k);
        for(int i=1;i<=k;i++) scanf("%lld%lld",&a[i],&r[i]);
        printf("%lld",crt(k,a,r));
        return 0;
    }
    
    • 1

    信息

    ID
    691
    时间
    1000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    4
    已通过
    2
    上传者