HDU 6288 缺失的数据范围 大数范围+二分

Posted karshey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 6288 缺失的数据范围 大数范围+二分相关的知识,希望对你有一定的参考价值。

https://acm.dingbacode.com/showproblem.php?pid=6288
参考

做题的时候看到它狂喜,裸的二分也!稳了!
然后爆LL了。哈哈!
用unsigned long long 和__int128才能过

ps:二分范围是从0到1e18 ;
而且二分要 l=mid+1,ans=mid;r=mid; 不然会T。
我粗略的理解是如果l=mid,r=mid-1,要返回的会慢一些(?),或许是有的数据会死循环…?
ps:防止爆了,mid=l+(r-l)/2来代替mid=(l+r)/2;

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
using it=__int128;
#define pb push_back
#define fi first
#define se second
#define mem(a,x) memset(a,x,sizeof(a));
#define db double 
#define fir(i,a,n) for(int i=a;i<=n;i++)
//======================
const int N=1e5+10;
int a,b;ull k;
it Log(ll mid)
{
	return ceil(log2(mid));//ceil向上取整函数 
}
int judge(ull mid)//1不超过 
{
	it ans1=1;
	for(int i=1;i<=a;i++)
	{
		ans1*=mid;
		if(ans1>k) return 0;
	}
	it ans2=Log(mid);
	if(ans2>k) return 0;
	
	for(int i=1;i<=b;i++)
	{
		ans1*=ans2;
		if(ans1>k) return 0;
	}
	
	return 1;
	
}
int main()
{
	int t;cin>>t;
	while(t--)
	{
		scanf("%d%d%llu",&a,&b,&k);
		ull l=0,r=1e18,mid;
		ull ans;
		while(l<r)
		{
			mid=l+(r-l)/2;
			if(judge(mid)) l=mid+1,ans=mid;
			else r=mid;
		}
		cout<<ans<<endl;
	}
	return 0; 
}

以上是关于HDU 6288 缺失的数据范围 大数范围+二分的主要内容,如果未能解决你的问题,请参考以下文章

HDU6621 K-th Closest Distance 第 k 小绝对值(主席树(统计范围的数有多少个)+ 二分 || 权值线段树+二分)

HDU - 4430 - Yukari's Birthday

mysql - 缺失范围和连续范围

SQL Server:填写每个实体具有不同日期范围的缺失日期

搜索插入位置----二分查找

大数的运算