2 solutions
-
4
易得:
#include<bits/stdc++.h> #define LL long long using namespace std; void exgcd(LL a, LL b, LL &g, LL &x, LL &y) { if (b == 0) g = a, x = 1, y = 0; else exgcd(b, a%b, g, y, x), y -= (a/b) * x; } LL inv(LL a, LL mo) { LL g, x, y; exgcd(a, mo, g, x, y); return (x + mo) % mo; } int n; int main () { cin >> n; LL A = 1, B = 0; for (int i = 1; i <= n; i++) { LL a, b; cin >> a >> b; LL g, x, y; exgcd(a, A, g, x, y); A = (a / g) * A; B = ((B-b) / g * x % A * a % A + b + A) % A; } cout << B << endl; } /* x % a1 = b1; x % a2 = b2; ==> a1 * c1 - a2 * c2 = b2 - b1; c1 = x, x2 = -y; c1 * a1 + b1 = x; (kx * a + k * b y)% A = B; */
-
1
#include <bits/stdc++.h> #define int long long using namespace std; int n; void exgcd(int a, int b, int &g, int &x, int &y) { // ax + by = gcd(a, b) if (b == 0) { g = a, x = 1, y = 0; } else { exgcd(b, a % b, g, y, x); y -= a / b * x; } } int lcm(int x, int y) { return x / __gcd(x, y) * y; } void mgr(int a, int b, int m1, int m2, int &B, int &m) { // x = a (mod m1) + x = b (mod m2) => x = m1*p+a1 (mod lcm(m1, m2)) // exgcd: m1*p-m2*q = b - a m = lcm(m1, m2); int g, x, y; exgcd(m1, m2, g, x, y); x = (x % m * ((((b - a) / g) + m) % m) + m) % m; B = (((m1 % m * x % m + a % m) % m) + m) % m; } bool chk(int a1, int a2, int m1, int m2) { // when (a2 - a1) % gcd(m1, m2) != 0 return false // else return true; if ((a2 - a1) % __gcd(m1, m2) != 0) return false; return true; } signed main() { cin >> n; int B, MOD; int b, mod; cin >> MOD >> B; for (int i = 1; i < n; ++i) { cin >> mod >> b; // if (!chk(b, baseB, a, baseA)) { // cout << -1 << endl; // return 0; // } // mgr(B, b, MOD, mod, B, MOD); mgr(b, B, mod, MOD, B, MOD); } cout << B % MOD << endl; return 0; }
- 1
Information
- ID
- 487
- Time
- 1000ms
- Memory
- 512MiB
- Difficulty
- 5
- Tags
- # Submissions
- 43
- Accepted
- 12
- Uploaded By