D. Moderate Modular Mode
题目大意:
给定两个数,
x
,
y
x,y
x,y,求出一个数
n
n
n使得
n
m
o
d
x
=
y
m
o
d
n
n mod x = y mod n
nmodx=ymodn.
思路:
显然我们对于
x
x
x,
y
y
y的大小可以进行一个初步的限定。
当 x x x大于 y y y时,为了满足条件,我们可以直接让 n n n mod x x x 的值为 y y y,即此时直接输出 x + y x + y x+y。
当 x x x等于 y y y时,直接输出 x x x即可。
难点就在第三种情况,当 x x x小于 y y y时,如何进行构造,求出答案。
首先我们要思考答案所处的范围
首先答案n肯定不能小于x,若 n n n小于 x x x,那么说此时 n m o d x = n n mod x = n nmodx=n,而 y m o d n ymodn ymodn所得的数一定是小于n的,显然答案不在此区间。
其次n肯定不大于y,假设 n n n大于 y y y,此时 x x x小于 y y y,那么说 n m o d x = h < x n mod x = h < x nmodx=h<x,而 y m o d n = y y mod n = y ymodn=y,y一定大于h,即 n n n也不在此区间。
所以说答案n一定存在于x,y之间。那么我们的答案,应该是x的h倍又余上一个数k,而恰好 y y y与这个数取模也能得到这个余数 k k k,显然我们可以从 y y y中一定能找到一个数 p = y − y m o d x p=y-ymodx p=y−ymodx。 p p p一定是 x x x的 h h h倍,那么我们就只需要找出这个特定的余数即可。这个余数怎么找?前面几句话提到,这个答案一定小于y那么说明我们在进行 y m o d n ymodn ymodn这个操作的结果时实际上是进行了减法操作,得出的结果是 y − n = k y - n = k y−n=k,即我们最后的余数为 y m o d x 2 \frac{y mod x}{2} 2ymodx,那么我们的答案也就是 p + k p + k p+k
#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
#include<iostream>
#include<map>
using namespace std;
const int N = 1e6 + 10;
typedef long long ll;
typedef pair<int, int> pii;
const int mod = 998244353;
int a[N];
map<int, int>mp;
int main()
{
int t;
cin >> t;
while (t--)
{
ll x, y;
cin >> x >> y;
if (x > y) {
cout << x * y + y << endl;
}
else if (x == y) {
cout << x << endl;
}
else {
if (y % x == 0) {
cout << y << endl;
}
else {
cout << y - y % x / 2 << endl;
}
}
}
}
// _ooOoo_
// o8888888o
// 88" . "88
// (| -_- |)
// O\ = /O
// ____/`---'\____
// .' \| |// `.
// / \||| : |||// \
// / _||||| -:- |||||- \
// | | \\ - /// | |
// | \_| ''\---/'' | |
// \ .-\__ `-` ___/-. /
// ___`. .' /--.--\ `. . __
// ."" '< `.___\_<|>_/___.' >'"".
// | | : `- \`.;`\ _ /`;.`/ - ` : | |
// \ \ `-. \_ __\ /__ _/ .-` / /
// ======`-.____`-.___\_____/___.-`____.-'======
// `=---='
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// Buddha blesses the code with no bugs