CF1603B Moderate Modular Mode

题目大意

给定两个偶数 x,yx,y

求一个 n[1,2×1018]n \in [1,2\times10^{18}] 满足 nmodx=ymodnn \bmod x = y \bmod n

tt 组数据。

对于 100%100\% 的数据,1t105,2x,y1091 \leq t \leq 10^5,2 \leq x,y \leq 10^9

解题思路

x>yx > y 时,(x+y)modx=ymodx=ymod(x+y)(x + y) \bmod x=y \bmod x=y \bmod (x + y),所以 x+yx+y 即为答案。

x=yx=y 时,x,yx,y 即为答案。

x<yx<y 时,很明显 xnyx \leq n \leq y

证明:

如果 n<xn < x,那么 nmodx=nn \bmod x=n,但 ymodn<ny \bmod n < n,不成立,xnx \leq n

如果 n>yn >y,那么 ymodn=yy \bmod n=y,但 nmodx<xn \bmod x < x,此时 xyx \leq y,不成立,nyn \leq y

考虑设 ddy\leq y 且是 xx 的倍数的最大数,那么有 2d>y2d>y

所以 1yd<21 \leq \frac{y}{d} < 2,那么 ymodd=yyd×d=ydy \bmod d = y - \left\lfloor \frac{y}{d} \right\rfloor \times d=y-d

又因为 dd 增加 11 会使 dmodxd\bmod x 增加 11,而 ymoddy\bmod d 会减少 11

所以当 dd 增加 y mod d2\frac{y \ mod \ d}{2} 时,dmodx=ymoddd \bmod x=y \bmod d

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;
}
posted @ 2021-11-12 19:13  蒟蒻orz  阅读(2)  评论(0编辑  收藏  举报  来源