B. Moderate Modular Mode(1603B)(思维、数学)

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;
}

END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值