Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <stack>
- #include <map>
- #include <queue>
- #include <algorithm>
- #include <iomanip>
- #include <iomanip>
- #include <vector>
- #include <random>
- #include <chrono>
- using namespace std;
- tuple<long long, long long, long long> gcd(long long a, long long b) {
- if (b == 0)
- return {a, 1, 0};
- auto[d, x1, y1] = gcd(b, a % b);
- return {d, y1, x1 - y1 * (a / b)};
- }
- pair<long long, long long> diofant(long long a, long long b, long long c) {
- long long k = 1, x, y;
- auto[d, x1, y1] = gcd(a, b);
- if (c % d != 0) {
- return {-1, -1};
- }
- a /= d;
- b /= d;
- c /= d;
- x = x1 * c;
- y = y1 * c;
- k = abs(x) / b;
- x += b * k;
- y -= a * k;
- while (x < 0) {
- x += b;
- y -= a;
- }
- return {x, y};
- }
- long long inverse(long long a, long long m) {
- if (a == 0) {
- return -1;
- }
- return diofant(a, -m, 1).first;
- }
- int main() {
- long long n1, a, b, n, m, n_, m_;
- cin >> n1;
- while (n1--) {
- cin >> a >> b >> n >> m;
- int g = get<0>(gcd(a, b));
- if (a % g != b % g) {
- cout << "NO" << '\n';
- continue;
- }
- n /= g;
- m /= g;
- m_ = inverse(m, n);
- n_ = inverse(n, m);
- cout << (a * m * m_ + b * n * n_) % (n * m) << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement