CF1476A - K-divisible Sum
卡题点:看到“最小化最大值”就想二分,但这题其实是纯数学构造 + 取上整。
题意重述
给定
能被 整除 尽量小
输出最小可能的
关键观察(把问题变成“区间里有没有 的倍数”)
如果我们规定
并且任意
所以存在解当且仅当区间
令
那么只要
也就是“两次取上整”:先把总和提到不小于
直接公式(实现时全是整数除法)
设 ceil_div(x,y) = (x+y-1)/y(正整数)。
S0 = ceil_div(n, k) * kans = ceil_div(S0, n)
复杂度
为什么一定能构造(理解用,不用真的输出数组)
取
参考代码(C++)
cpp
#include <bits/stdc++.h>
using namespace std;
static long long ceil_div(long long x, long long y) {
return (x + y - 1) / y;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
long long n, k;
cin >> n >> k;
long long s0 = ceil_div(n, k) * k;
long long ans = ceil_div(s0, n);
cout << ans << "\n";
}
return 0;
}快速自检(对拍脑子)
n=1,k=5:S0=5,ans=5n=4,k=3:S0=6,ans=2n=8,k=8:S0=8,ans=1n=8,k=17:S0=17,ans=3