exCRT求调
查看原帖
exCRT求调
366937
too_simple楼主2022/10/16 10:56
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>

#define int long long

using namespace std;

const int N = 12;

int k;
int a[N], b[N];
int m, p;
int x, y;
int del, l;

int gcd(int a, int b) {
    if(a < b) swap(a, b);
    return b == 0 ? a : gcd(b, a % b);
}

void exgcd(int a, int b, int &x, int &y) {
    if(b == 0) {
        x = 1, y = 0;
        return;
    }
    exgcd(b, a % b, y, x);
    y -= (a / b) * x;
}

int mul(int a, int k, int mod) {
    int res = 0;
    while(k) {
        if(k & 1) res = (res + a) % mod;
        a = (a + a) % mod;
        k >>= 1;
    }
    return res;
}

signed main() {
    
    cin >> k;
    
    for(int i = 1; i <= k; ++ i) cin >> a[i];
    for(int i = 1; i <= k; ++ i) cin >> b[i];
    
    m = a[1], p = b[1];
    
    for(int i = 2; i <= k; ++ i) {
        del = (a[i] - m) % b[i];
        del = (del + b[i]) % b[i];
        exgcd(p, b[i], x, y);
        l = p * b[i];
        x = mul(x, del, l);
        x = (x + l) % l;
        m = (mul(p, x, l) + m) % l;
        p = l;
    }
    
    cout << m << endl;
    
    return 0;
}
2022/10/16 10:56
加载中...