Advertisement
vov44k

Untitled

Jan 4th, 2022
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.40 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <stack>
  4. #include <map>
  5. #include <queue>
  6. #include <algorithm>
  7. #include <iomanip>
  8. #include <iomanip>
  9. #include <vector>
  10. #include <random>
  11. #include <chrono>
  12.  
  13. using namespace std;
  14.  
  15. tuple<long long, long long, long long> gcd(long long a, long long b) {
  16.     if (b == 0)
  17.         return {a, 1, 0};
  18.     auto[d, x1, y1] = gcd(b, a % b);
  19.     return {d, y1, x1 - y1 * (a / b)};
  20. }
  21.  
  22. pair<long long, long long> diofant(long long a, long long b, long long c) {
  23.     long long k = 1, x, y;
  24.  
  25.  
  26.     auto[d, x1, y1] = gcd(a, b);
  27.     if (c % d != 0) {
  28.         return {-1, -1};
  29.     }
  30.  
  31.     a /= d;
  32.     b /= d;
  33.     c /= d;
  34.  
  35.     x = x1 * c;
  36.     y = y1 * c;
  37.     k = abs(x) / b;
  38.     x += b * k;
  39.     y -= a * k;
  40.  
  41.     while (x < 0) {
  42.         x += b;
  43.         y -= a;
  44.     }
  45.     return {x, y};
  46. }
  47.  
  48. long long inverse(long long a, long long m) {
  49.     if (a == 0) {
  50.         return -1;
  51.     }
  52.     return diofant(a, -m, 1).first;
  53. }
  54.  
  55. int main() {
  56.     long long n1, a, b, n, m, n_, m_;
  57.     cin >> n1;
  58.     while (n1--) {
  59.         cin >> a >> b >> n >> m;
  60.         int g = get<0>(gcd(a, b));
  61.         if (a % g != b % g) {
  62.             cout << "NO" << '\n';
  63.             continue;
  64.         }
  65.         n /= g;
  66.         m /= g;
  67.         m_ = inverse(m, n);
  68.         n_ = inverse(n, m);
  69.         cout << (a * m * m_ + b * n * n_) % (n * m) << endl;
  70.     }
  71.     return 0;
  72. }
  73.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement