K-divisible Sum
题目描述
You are given two integers n n n and k k k.
You should create an array of n n n positive integers a 1 , a 2 , … , a n a_1, a_2, \dots, a_n a1,a2,…,an such that the sum ( a 1 + a 2 + ⋯ + a n ) (a_1 + a_2 + \dots + a_n) (a1+a2+⋯+an) is divisible by k k k and maximum element in a a a is minimum possible.
What is the minimum possible maximum element in a a a?
输入描述
The first line contains a single integer t t t ( 1 ≤ t ≤ 1000 1 \le t \le 1000 1≤t≤1000) — the number of test cases.
The first and only line of each test case contains two integers n n n and k k k ( 1 ≤ n ≤ 1 0 9 1 \le n \le 10^9 1≤n≤109; 1 ≤ k ≤ 1 0 9 1 \le k \le 10^9 1≤k≤109).
输出描述
For each test case, print one integer — the minimum possible maximum element in array a a a such that the sum ( a 1 + ⋯ + a n ) (a_1 + \dots + a_n) (a1+⋯+an) is divisible by k k k.
样例 #1
样例输入 #1
4
1 5
4 3
8 8
8 17
样例输出 #1
5
2
1
3
提示
In the first test case n = 1 n = 1 n=1, so the array consists of one element a 1 a_1 a1 and if we make a 1 = 5 a_1 = 5 a1=5 it will be divisible by k = 5 k = 5 k=5 and the minimum possible.
In the second test case, we can create array a = [ 1 , 2 , 1 , 2 ] a = [1, 2, 1, 2] a=[1,2,1,2]. The sum is divisible by k = 3 k = 3 k=3 and the maximum is equal to 2 2 2.
In the third test case, we can create array a = [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ] a = [1, 1, 1, 1, 1, 1, 1, 1] a=[1,1,1,1,1,1,1,1]. The sum is divisible by k = 8 k = 8 k=8 and the maximum is equal to 1 1 1.
原题
思路
我们把
s
u
m
sum
sum 表示为数组
a
a
a 的和。因为
s
u
m
sum
sum 能被
k
k
k 整除,所以令
s
u
m
=
n
u
m
⋅
k
sum = num \cdot k
sum=num⋅k。同时又因为所有的
a
i
a_i
ai 都是正数,所以
s
u
m
≥
n
sum \ge n
sum≥n。显然,
s
u
m
sum
sum 的值越小,最大值
a
m
a
x
a_{max}
amax 就越小,所以我们需找到使得
s
u
m
≥
n
sum \ge n
sum≥n 成立的最小的
n
u
m
num
num,即
⌈
n
k
⌉
\left\lceil \frac{n}{k} \right\rceil
⌈kn⌉。确定了
n
u
m
num
num 的值后,
s
u
m
sum
sum 的值也就确定了,即
s
u
m
=
n
u
m
⋅
k
sum = num \cdot k
sum=num⋅k。
那么剩下的问题就是:和为
s
u
m
sum
sum,长度为
n
n
n 的数组,如何构造使得其中的最大值最小 ?对于这个问题,我们利用贪心的思想,在数组的
n
n
n 个位置上逐个地填补
1
1
1,循环这个操作直至
s
u
m
sum
sum 拆成
s
u
m
sum
sum 个
1
1
1 后全部被填补到数组里。通过这样的方式,我们总是可以构造出数组
a
a
a ,它的和等于
s
u
m
sum
sum,长度等于
n
n
n,最大元素的值等于
⌈
s
n
⌉
\left\lceil \frac{s}{n} \right\rceil
⌈ns⌉ 。
代码
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
typedef long long ll;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int t;
cin >> t;
while (t--)
{
i64 n, k;
cin >> n >> k;
i64 num = ceil(1.0 * n / k);
i64 sum = num * k;
i64 maxn = ceil(1.0 * sum / n);
cout << maxn << '\n';
}
return 0;
}