为什么Unaccept但100
查看原帖
为什么Unaccept但100
1303101
qiangruihong楼主2025/1/4 14:53
#include <iostream>  
#include <vector>  
using namespace std;  

// 扩展欧几里得算法,返回 gcd, x, y 使得 ax + by = gcd(a, b)  
long long extendedGCD(long long a, long long b, long long &x, long long &y) {  
    if (b == 0) {  
        x = 1;  
        y = 0;  
        return a;  
    }  
    long long gcd = extendedGCD(b, a % b, y, x);  
    y -= (a / b) * x;  
    return gcd;  
}  

// 计算中国剩余定理  
long long chineseRemainderTheorem(const vector<long long> &a, const vector<long long> &b) {  
    long long M = 1; // 所有模的乘积  
    for (long long ai : a) {  
        M *= ai;  
    }  

    long long result = 0; // 最终结果  
    for (size_t i = 0; i < a.size(); i++) {  
        long long ai = a[i];  
        long long bi = b[i];  
        
        long long Mi = M / ai; // M除以当前模  
        long long x, y;  
        extendedGCD(Mi, ai, x, y); // 求解 Mi 和 ai 的 gcd  
        
        // x 是 Mi 的逆元 mod ai  
        long long inverse = (x % ai + ai) % ai; // 保证逆元为正  
        
        result = (result + bi * Mi * inverse) % M; // 组合结果  
    }  
    
    // 确保结果为正  
    return (result + M) % M;  
}  

int main() {  
    int n;  
    cin >> n;  
    
    vector<long long> a(n), b(n);  
    for (int i = 0; i < n; i++) {  
        cin >> a[i] >> b[i];  
    }  
    
    long long result = chineseRemainderTheorem(a, b);  
    cout << result << endl;  
    
    return 0;  
}  
2025/1/4 14:53
加载中...