HDU - 6288 缺失的数据范围 (二分+高精度)

题目:缺失的数据范围
题意:满足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++再交一次,你会发现新大陆。呜呜呜~~,又在这里卡了一年。看来要退役了。

猜你喜欢

转载自blog.csdn.net/dhydye/article/details/80538202