This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub AlexanderNekrasov/Youthful-Passion-Fruit-teambook
/**
* Author: Iurii Pustovalov
* Date: 2024-08-09
* Description: CRT for arbitrary modulos
*/
int extgcd(int a, int b, int &x, int &y) { // define int ll
if (a == 0) {
x = 0, y = 1;
return b;
}
int x1, y1;
int g = extgcd(b % a, a, x1, y1);
x = y1 - x1 * (b / a);
y = x1;
return g;
}
int lcm(int a, int b) { return a / __gcd(a, b) * b; }
int crt(int mod1, int mod2, int rem1, int rem2) {
int r = (rem2 - (rem1 % mod2) + mod2) % mod2;
int x, y;
int g = extgcd(mod1, mod2, x, y);
if (r % g) return -1;
x %= mod2;
if (x < 0) x += mod2;
int ans = (x * (r / g)) % mod2;
ans = ans * mod1 + rem1;
assert(ans % mod1 == rem1);
assert(ans % mod2 == rem2);
return ans % lcm(mod1, mod2);
}
#line 1 "math/CRT.cpp"
/**
* Author: Iurii Pustovalov
* Date: 2024-08-09
* Description: CRT for arbitrary modulos
*/
int extgcd(int a, int b, int &x, int &y) { // define int ll
if (a == 0) {
x = 0, y = 1;
return b;
}
int x1, y1;
int g = extgcd(b % a, a, x1, y1);
x = y1 - x1 * (b / a);
y = x1;
return g;
}
int lcm(int a, int b) { return a / __gcd(a, b) * b; }
int crt(int mod1, int mod2, int rem1, int rem2) {
int r = (rem2 - (rem1 % mod2) + mod2) % mod2;
int x, y;
int g = extgcd(mod1, mod2, x, y);
if (r % g) return -1;
x %= mod2;
if (x < 0) x += mod2;
int ans = (x * (r / g)) % mod2;
ans = ans * mod1 + rem1;
assert(ans % mod1 == rem1);
assert(ans % mod2 == rem2);
return ans % lcm(mod1, mod2);
}