2 solutions

  • 4
    @ 2024-2-21 19:12:25

    易得:

    #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
      @ 2024-2-21 19:11:39
      #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