分析
考虑每次新增的有文件的机子能有几个,若当前已有 \(a\) 个,若 \(a\leq k\),那么本次就增加 \(a\) 个,否则本次就增加 \(k\) 个。所以先不断翻倍,直到个数大于 \(k\) 个,还需要传输的次数就是剩下的值需要减 \(k\) 减到小于等于 \(0\) 的次数了,一个除法就解决了。所以单次询问就是 \(O( \log k)\),可以通过本题。
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline void read(int &res){
char c;
int f=1;
res=0;
c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')res=(res<<1)+(res<<3)+c-48,c=getchar();
res*=f;
}
int T;
int n,k;
signed main()
{
read(T);
while(T--){
read(n);read(k);
int ans=0,sum=1;
while(sum<n&&sum<k){
ans++;
sum*=2;
}
if(sum>=n)printf("%lld\n",ans);
else {
ans+=(n+k-1-sum)/k;
printf("%lld\n",ans);
}
}
return 0;
}