二分+相乘防溢出+2018字节跳动杯CCPC-B-缺失的数据范围

匿名 (未验证) 提交于 2019-12-03 00:22:01
著名出题人小Q出过非常多的题目,在这个漫长的过程中他发现,确定题目的数据范围是非常痛苦的一件




因为确定数据范围是一件痛苦的事,小Q出了非常多的题目之后,都没有它们设置数据范围。对于一道题目,小Q会告诉你他的算法的时间复杂度为O(nalogbn),且蕴含在这个大OO记号下的常数为11。同时,小Q还会告诉你评测机在规定时限内可以执行kk条指令。小Q认为只要na(log2n)b不超过kk,那么就是合理的数据范围。其中,x表示最小的不小于xx的正整数,即xx

自然,小Q希望题目的数据范围nn越大越好,他希望你写一个程序帮助他设置最大的数据范围。
Input第一行包含一个正整数T(1T1000)T(1≤T≤1000)

每组数据包含一行三个正整数a,b,k(1a,b10,106k1018)a,b,k(1≤a,b≤10,106≤k≤1018),分别描述时间复杂度以及允许的指令数。Output对于每组数据,输出一行一个正整数nn,即最大可能的nn。Sample Input
3 1 1 100000000 2 1 100000000 1 3 200000000
Sample 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,但取错端点输出还是很好看出来的! } } 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!