分析

考虑每次新增的有文件的机子能有几个,若当前已有 \(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;
}


posted on 2021-11-12 16:19  漠寒·  阅读(92)  评论(0编辑  收藏  举报