给两个数 \(\frac{a}{b}\) 和 \(\frac{c}{d}\) ,一次修改可以修改 \(a\) 或 \(b\) 之一,求最小修改数使得 \(\frac{a}{b} = \frac{c}{d}\) 。
- 若 \(\frac{a}{b} = \frac{c}{d}\) ,除式化乘式,则讨论 \(ad = bc\) 。允许修改 \(a, b\) 。
- 不妨让 \(x = min(ad, bc), y = max(ad, bc)\) 。
- 若 \(x = y\) ,修改 \(0\) 次、
- 否则若 \(gcd(x, y) = x || y\) ,修改 \(1\) 次。
- 否则修改两次。
view
#include <bits/stdc++.h>
long long gcd(long long a, long long b) {return b?gcd(b,a%b):a;}
void solve() {
int a, b, c, d; std::cin >> a >> b >> c >> d;
long long x = 1LL * a * d, y = 1LL * b * c;
if (x > y) std::swap(x, y);
if (x == y) std::cout << 0 << '\n';
else if (gcd(x, y) == x || gcd(x, y) == y) std::cout << 1 << '\n';
else std::cout << 2 << '\n';
}
signed main() {
int _ = 1; std::cin >> _;
while (_--) solve();
return 0;
}