60分求调悬关
查看原帖
60分求调悬关
556649
_zhang楼主2024/8/3 11:24
#include <cstdio>
#define int long long int
const int N = 1e5, inf = 1e18;
int n;
int a[N], p[N];
int exgcd(int a, int b, int &x, int &y) {
    if (!b) {
        x = 1, y = 0;
        return a;
    }
    int d = exgcd(b, a % b, y, x);
    y -= a / b * x;
    return d;
}
int solution(int a, int b, int c, int &x, int &y) {
    int x0, y0;
    bool flagx = 0, flagy = 0;
    if (a < 0) a *= -1, flagx = 1;
    if (b < 0) b *= -1, flagy = 1;
    int d = exgcd(a, b, x0, y0);
    if (flagx) x *= -1;
    if (flagy) y *= -1;
    if (c % d) return 0;
    x = x0 * (c / d), y = y0 * (c / d);
    return d;
}
int exCRT(int n, int a[], int p[]) {
    int p0 = p[1], a0 = a[1];
    for (int i = 2; i <= n; i++) {
        //printf("now: x=%lld(mod %lld) && \n    x=%lld(mod %lld)\n\n", a0, p0, a[i], p[i]);
        int k0, k;
        int gcd = solution(p0, p[i], a[i] - a0, k0, k);
        if (!gcd) return -1;
        int d = p[i] / gcd;
        k0 %= d;
        a0 = k0 * p0 + a0;
        p0 = p0 * d;
        a0 = (a0 % p0 + p0) % p0;
    }
    return a0;
}
signed main() {
    scanf("%lld", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%lld %lld", &p[i], &a[i]);
        a[i] %= p[i];
    }
    int x = exCRT(n, a, p);
    printf("%lld\n", x);
    return 0;
}

为啥又WA又RE( https://www.luogu.com.cn/record/170246947

2024/8/3 11:24
加载中...