Description
有一个
1
~
Input
第一行一整数
Output
对于每组用例,输出最坏情况下还原整个序列所需的最少询问次数
Sample Input
5
4 1
4 2
7 3
1 1
42 7
Sample Output
3
2
3
0
11
Solution
如果对于任意
k
,可以知道
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
int T,n,m;
bool check(int k)
{
if(n==1)return 1;
ll num=(ll)m*k,res=1,C=1;
for(int i=1;i<=k;i++)
{
if(num<i)return 0;
if((ll)(k-i+1)*C>=(ll)n*i)C=n;
else C=C*(k-i+1)/i;
ll temp=min(num/i,C);
res+=temp;
if(res>=n)return 1;
num-=temp*i;
}
return 0;
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
int l=0,r=n,mid,ans;
while(l<=r)
{
mid=(l+r)/2;
if(check(mid))ans=mid,r=mid-1;
else l=mid+1;
}
printf("%d\n",ans);
}
return 0;
}