B. Moderate Modular Mode(1603B)(思维、数学)
题目来源:B. Moderate Modular Mode
题意:
给出两个偶数 x 和 y,2 <= x, y <= 1e9,找到一个 n,使得 n % x = y % n,并且 1 <= n <= 2e18
思路:
-
当 x > y 时, 不难发现,只要让 n = x + y 即可
-
当 x <= y 时,我们分三个区间来选取
-
取 n < x 时,n % x = n,y % n < n,显然不成立
-
取 n > y 时,y % n = y,n % x < x,显然不成立
-
取 x <= n <= y时,答案一定存在
取整数 p,使得 p * x <= y,那么此时 p * x % x = 0,y % (p * x) = y - p * x, 由于 y 和 x 都是偶数,所以 y - p * x 一定也是一个偶数, 我们只需取 [p * x, y] 的中值即可, 也就是说 n = y - (y - p * x) / 2, 换句话说,此时 y % (p * x) = y - p * x 等价于 y % x,那么 n = y - y % x / 2
-
AC代码
#include <bits/stdc++.h>
#define endl "\n"
#define rep(i, m, n) for (int i = (m); i <= (n); ++i)
#define rrep(i, m, n) for (int i = (m); i >= (n); --i)
#define IOS ios::sync_with_stdio(0); cin.tie(0);
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int N = 1e5 + 10, mod = 1e9 + 7;
ll x, y;
void solve() {
scanf("%lld %lld", &x, &y);
ll ans;
if (x > y) ans = x + y;
else ans = y - y % x / 2;
printf("%lld\n", ans);
}
int main() {
int t; cin >> t;
while (t--) solve();
return 0;
}