Educational Codeforces Round 103 (Rated for Div. 2) A. K-divisible Sum)
题面
You are given two integers (n) and (k).
You should create an array of (n) positive integers (a1,a2,…,an) such that the sum ((a1+a2+⋯+an)) is divisible by (k) and maximum element in aa is minimum possible.
What is the minimum possible maximum element in (a)?
Input
The first line contains a single integer (t) ((1≤t≤1000)) — the number of test cases.
The first and only line of each test case contains two integers (n) and (k) ((1≤n≤109))(1≤; (1≤k≤109)).
Output
For each test case, print one integer — the minimum possible maximum element in array aa such that the sum ((a1+⋯+an)) is divisible by (k).
Example
input
4
1 5
4 3
8 8
8 17
output
5
2
1
3
Note
In the first test case (n=1), so the array consists of one element (a1) and if we make (a1=5) it will be divisible by (k=5) and the minimum possible.
In the second test case, we can create array (a=[1,2,1,2]). The sum is divisible by (k=3) and the maximum is equal to (2).
In the third test case, we can create array (a=[1,1,1,1,1,1,1,1]). The sum is divisible by (k=8) and the maximum is equal to (1).
题目分析
为了使构成的数组的最大值最小,只需要让数组中的元素尽可能相同即让数字都等于n / k
,当n / k
无法整除时,那么最大值就是 n / k
向上取整(ceil)。但是,当(n>k)时便无法满足,这个时候我们需要让k
倍增,使k刚好大于等于n,我们只需要k = k * ceil(k / n)
就可以实现。最终输出答案即可。
AC代码
#include<bits/stdc++.h>
using namespace std;
#define io ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
int t;
long long n, k;
int main(){
io;
cin >> t;
while(t--){
cin >> n >> k;
int t = k;
if(n > k){
k = k * (ceil((double)n / (double)k));
}
long long ans = ceil((double) k / (double)n);
cout << ans << endl;
}
return 0;
}