提供一种分类讨论的做法。
思路
对于输入的 x x x 和 y y y,会有一下三种情况:
-
x > y x>y x>y
易得,此时 n ← x + y n \gets x+y n←x+y 是符合条件的:
( x + y ) m o d x = y = y m o d ( x + y ) (x + y) \mod x = y = y \mod (x +y) (x+y)modx=y=ymod(x+y)
-
x = y x = y x=y
易得,此时 n ← x n \gets x n←x 是符合条件的(证明略)。
-
x < y x<y x<y
我们发现,当 x x x 和 y y y 的差小于 x x x 时,有 n ← x + y − x 2 n \gets x+\dfrac{y-x}{2} n←x+2y−x 是符合条件的。
所以我们只要每次让 x x x 和 y y y 的值接近即可,也就是让 x x x 的值翻倍但却不大于 y y y。
这样三种情况讨论完,这道题也就做出来了~
代码
#include<bits/stdc++.h>
using namespace std;
#define rint register int
int t, x, y;
int main ()
{
scanf ("%d", &t);
while (t--)
{
scanf ("%d %d", &x, &y);
if (x > y) printf ("%d\n", x + y);
if (x == y) printf ("%d\n", x);
if (x < y)
{
int s = x, tim = y / x;
x = x * (tim + 1);
if (x > y) x -= s;
printf ("%d\n", (y - x) / 2 + x);
}
}
return 0;
}