扩展中国剩余定理模版,int128,RE
  • 板块题目总版
  • 楼主Uuuuuur_
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/4/22 12:50
  • 上次更新2023/10/23 17:49:12
查看原帖
扩展中国剩余定理模版,int128,RE
536396
Uuuuuur_楼主2023/4/22 12:50
#include <iostream>
#include <algorithm>
using namespace std;
typedef __int128 ll;
ll gcd(ll a, ll b) {
    if (b == 0) return a;
    return gcd(b, a % b);
}
ll lcm(ll a, ll b) {
    return a  / gcd(a, b) * b;
}
ll exgcd(ll a, ll b, ll &x, ll &y) {
    if (b == 0) {
        x = 1;
        y = 0;
        return a;
    }
    ll d = exgcd(b, a % b, x, y);
    ll t = x;
    x = y;
    y = t - a / b * y;
    return d;
} 
ll mod_equ(ll a, ll b, ll &x, ll mod) {
    ll y;
    ll d = exgcd(a, mod, x, y);
    x = x * b / d;
    return (x % (mod / d) + mod / d) % (mod / d);
}
ll a[100005], mod[100005];
long long exCRT(int n) {
    ll m = 1, x0 = 0;
    for (int i = 1; i <= n; i++) {
        ll tx = x0;
        x0 += m * mod_equ(m, a[i] - x0, tx, mod[i]);
        if (x0 == -1) return -1;
        m = lcm(m, mod[i]);
    }
    return (long long)(x0);
}  


void read(ll &x) {
    x = 0;
    char c = getchar();
    while (c >= '0' && c <= '9') {
        x = x * 10 + c - '0';
        c = getchar();
    }
    
}
void print(ll x) {
    if (!x) return ;
    print(x / 10);
    putchar(x % 10 + '0');
}
int main() {
    ll n;
    read(n);
    for (int i = 1; i <= n; i++) {
        read(mod[i]);
        read(a[i]);
    }
    cout << exCRT(n);
    putchar('\n');
    return 0;
}

本地是能过的,但是评测机上一个样例都过不了

2023/4/22 12:50
加载中...