题目:缺失的数据范围
题意:满足n^a*(⌈log2n⌉)^b
<=k,的n的最大值。
思路:很明显就是二分n,向上取整可以先预处理出2^62,然后直接循环找到b的底数j,处理n^a*j^b一开始我们用的是powl,但是被卡精度了,卡了好久,我们也因为这题而崩溃了,正常状态下可以做的题也不会做。又没想到换一种check的方法。一直卡了3小时,后来才知道原来可以用k先除以a个n,再除以b个j,然后判断如果小于1就return0,否则return1。
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<string>
#include<math.h>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<bitset>
#define INF 0x3f3f3f3f//3f3f3f3f
#define lowbit(a) ((a)&(-(a)))
typedef long long ll;
using namespace std;
ll a,b,k;
ll s[100]={1};
int check(ll n)
{
int j=0;
for(j=0;j<=62;j++)
if(n<=s[j])break;
long double t=k;
for(int i=0;i<b;i++)
{
t=t/(long double)j;
if(t<1.0)return 0;
}
for(int i=0;i<a;i++)
{
t=t/(long double)n;
if(t<1.0)return 0;
}
return 1;
}
int main()
{
int ca;
scanf("%d",&ca);
for(int i=1;i<=62;i++)
{
s[i]=ll(1ll<<i);
}
while(ca--)
{
scanf("%lld%lld%lld",&a,&b,&k);
ll l=0,r=k,mid;
ll ans=0;
while(r-l>1)
{
mid=(l+r)/2;
if(check(mid))
{
l=mid;
}
else r=mid-1;
}
if(check(r))printf("%lld\n",r);
else printf("%lld\n",l);
}
return 0;
}
- PS:一定要用long double ,否则精度不够会wa。
- PPS:wa的时候,记得换成g++再交一次,你会发现新大陆。呜呜呜~~,又在这里卡了一年。看来要退役了。