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