题目大意
给定两个偶数 x,y。
求一个 n∈[1,2×1018] 满足 nmodx=ymodn。
t 组数据。
对于 100% 的数据,1≤t≤105,2≤x,y≤109。
解题思路
当 x>y 时,(x+y)modx=ymodx=ymod(x+y),所以 x+y 即为答案。
当 x=y 时,x,y 即为答案。
当 x<y 时,很明显 x≤n≤y。
证明:
如果 n<x,那么 nmodx=n,但 ymodn<n,不成立,x≤n。
如果 n>y,那么 ymodn=y,但 nmodx<x,此时 x≤y,不成立,n≤y。
考虑设 d 为 ≤y 且是 x 的倍数的最大数,那么有 2d>y。
所以 1≤dy<2,那么 ymodd=y−⌊dy⌋×d=y−d。
又因为 d 增加 1 会使 dmodx 增加 1,而 ymodd 会减少 1。
所以当 d 增加 2y mod d 时,dmodx=ymodd。
CODE
#include <bits/stdc++.h>
using namespace std;
int T, x, y;
signed main()
{
scanf("%d", &T);
while(T--)
{
scanf("%d%d", &x, &y);
if(x > y)
cout << x + y << "\n";
else
{
int d = y / x * x;
cout << d + (y % d) / 2 << "\n";
}
}
return 0;
}