题解 CF1476A 【K-divisible Sum】

题解前小彩蛋(雾


小彩蛋个鬼

思路

\(s\)是数组\(a\)的所有数的和。一方面,\(s\)应该能被\(k\)整除,那么我们就可以说\(s=cf·k\)。从另一方面,因为所有的\(a_i\)都是正数,所以\(s \geq n\)
非常明显的是,\(s\)越小,\(a_i\)的最大值越小,所以我们需要找到最小的\(cf\)使其可以达到\(cf·k \geq n\)。那么,\(cf=\lceil \frac{n}{k} \rceil=\lfloor \frac{n+k-1}{k} \rfloor\)
现在,我们知道,\(s=cf·k\),所以,我们需要在满足\(a_1+a_2+...+a_n\)并且\(a_i\)最小。证明\(a_i \geq \lceil \frac{s}{n} \rceil\)最大是与前面的陈述矛盾的。
还有,我们一定可以找到这样的一个数组\(a\),他的总和是\(s\)并且\(a\)最大的元素是等于\(\lceil \frac{s}{n} \rceil\)的。
结果是,答案是\(\lceil \frac{s}{n} \rceil=\lfloor \frac{cf·k+n-1}{n}\rfloor\)。这时,\(cf=\lfloor \frac{n+k-1}{k}\rfloor\)

code

#include<bits/stdc++.h>
using namespace std;
void solve() {
	int t;
	cin >> t;
	while(t--) {
		long long n, k;
		cin >> n >> k;
		long long cf = (n + k - 1) / k;
		k *= cf;
		cout << (k + n - 1) / n << endl;
  }
}
int main() {
  solve();
  return 0;
}
posted @ 2021-02-14 21:37  qinyihao  阅读(83)  评论(0)    收藏  举报