A. Exciting Bets
题目链接:https://codeforces.com/contest/1543/problem/A
题意:
t 组测试样例,给定两个整数 \(a,b(0\le a,b \ge 10^{18})\),每次可以将它们同时加 1 或者同时减 1,问它们的 gcd 最大为多少,输出最大 gcd 以及需要操作的次数,若 gcd 可以无限大则输出 0 0。
思路:
- 若 a 和 b 相等,则它们的 gcd 等于它们自己,可以不断将它们同时加 1 使得 gcd 可以无限增加,因此输出 0 0
- 若 a 和 b 不相等,则无论怎么操作它们的差值不会变,又因为 \(a=b+(a-b)\),所以 \(gcd(a,b)=gcd(b,a-b)\),因此它们的最大 gcd 不会超过 a-b,而 a 和 b 都可以不断增加,因此当 \(gcd(b,a-b)=a-b\) 时 a 和 b 的 gcd 最大,为 a-b。因此我们只需要将 b 构造为 a-b 的整数倍就可以了,即让 b 增大 \((a-b)-b\%(a-b)\) 或让 b 减少 \(b\%(a-b)\).
代码:
#include <iostream>
using namespace std;
typedef long long ll;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
ll t, a, b;
cin >> t;
while (t--)
{
cin >> a >> b;
ll ans = abs(a - b);
if (a == b)
cout << "0 0" << endl;
else
cout << ans << " " << min(b % ans, ans - b % ans) << endl;
}
}

浙公网安备 33010602011771号