B3770 Numeric Hack题解

B3770 Numeric Hack 题解

hack 代码:

#include <bits/stdc++.h>
using namespace std;
int main() {
	int n, k, d;
	cin >> n >> k >> d;
	++n;
	if (n % k == d) {
		cout << n << endl;
		return 0;
	}
	if (n % k < d) {
		n += (d - n % k);
	} else {
		n += (k + d - n % k);
	}
	cout << n << endl;
	return 0;
}

解决这个问题,我们首先要了解取余:

aadd 是整数,d0d\ne0 ,那么余数 rr 满足这样的关系:a=qd+ra=qd+rqq 为整数,且 0r<d0 \le |r| < |d|
——选自百度

Q:我怎么说起取余?

A:题目中有 n104(104)n104|n| \le 10^4 \to (-10^4) \le n \le 10^4,负数的取余有一点奇怪。

那么对于一个负数,取余可能有两个可能:如 (3)mod7(-3)\bmod71-122 都满足上面的负数取余的条件,(前者称为负余数,后者为正余数)那么可以针对这个地方下手。

但是不能直接写 hack 数据:

  • 如果 nnkk 同号,是使商尽可能小,只有一个余数(你不会说 7mod3=27\bmod3=-2 )。
  • 如果 nnkk 异号,可能有两个余数。

所以记得 nnkk 异号,其他没什么好说的。

posted @ 2023-06-22 22:25  sLMxf  阅读(9)  评论(0)    收藏  举报  来源