著名出题人小Q出过非常多的题目,在这个漫长的过程中他发现,确定题目的数据范围是非常痛苦的一件
因为确定数据范围是一件痛苦的事,小Q出了非常多的题目之后,都没有它们设置数据范围。对于一道题目,小Q会告诉你他的算法的时间复杂度为O(nalogbn),且蕴含在这个大OO记号下的常数为11。同时,小Q还会告诉你评测机在规定时限内可以执行kk条指令。小Q认为只要na(log2n)b不超过kk,那么就是合理的数据范围。其中,x表示最小的不小于xx的正整数,即xx
自然,小Q希望题目的数据范围nn越大越好,他希望你写一个程序帮助他设置最大的数据范围。
每组数据包含一行三个正整数a,b,k(1≤a,b≤10,106≤k≤1018)a,b,k(1≤a,b≤10,106≤k≤1018),分别描述时间复杂度以及允许的指令数。Output对于每组数据,输出一行一个正整数nn,即最大可能的nn。Sample Input
3 1 1 100000000 2 1 100000000 1 3 200000000Sample Output
4347826 2886 48828
求解方程,二分是标准思路,但是此题很多细节方面的坑!
3. 下界l至少要取2(暂时不知道原因)
#include<bits/stdc++.h> using namespace std; unsigned long long k,a,b; bool Judge(long long mid) { long long temp1=1; for(int i=0;i<a;i++) { if(temp1<k/mid) temp1*=mid; else return false; } long long temp2=1; long long y=(log(mid)/log(2)); if(pow(2,y)!=mid)//对数为非整数 y+=1; for(int i=0;i<b;i++) { if(temp2<=k/y) temp2*=y; else return false; } if(temp1<=k/temp2) return true; else return false; } int main() { int T; cin>>T; while(T--) { cin>>a>>b>>k; long long l=2; long long r= (long long)(1e18); while(l<=r) { long long mid=(l+r)/2; if(Judge(mid)) l=mid+1; else r=mid-1; } cout<<l-1<<endl;//或者取r,但取错端点输出还是很好看出来的! } }