• B - 缺失的数据范围


    著名出题人小Q出过非常多的题目,在这个漫长的过程中他发现,确定题目的数据范围是非常痛苦的一件事。

    每当思考完一道题目的时间效率,小Q就需要结合时限以及评测机配置来设置合理的数据范围。

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

    自然,小Q希望题目的数据范围nn越大越好,他希望你写一个程序帮助他设置最大的数据范围。

    Input

    第一行包含一个正整数T(1\leq T\leq 1000)T(1≤T≤1000),表示测试数据的组数。

    每组数据包含一行三个正整数a,b,k(1\leq a,b\leq 10,10^6\leq k\leq 10^{18})a,b,k(1≤a,b≤10,106≤k≤1018),分别描述时间复杂度以及允许的指令数。

    Output

    对于每组数据,输出一行一个正整数nn,即最大可能的nn。

    Sample

    InputcopyOutputcopy
     
    3 1 1 100000000 2 1 100000000 1 3 200000000
     
    4347826 2886 48828

     思路:二分n

    注意log2不能使用longlong,需要手写log2

    1. ll log(ll x){
    2. ll con=0;
    3. ll ans=1;
    4. while(ans<x){
    5. con++;
    6. ans*=2;
    7. }
    8. return con;
    9. }

    然后因为n^a会爆longlong,那么我们就用__int128存数

    乘a个n再乘b个log(n),每乘一下判断是不是小于k即可

    1. bool cheek(ll n){
    2. __int128 ans=1;
    3. for(int i=0;i<a;i++){
    4. ans*=n;
    5. if(ans>k)return false;
    6. }
    7. ll op=log(n);
    8. for(int i=0;i<b;i++){
    9. ans*=op;
    10. if(ans>k)return false;
    11. }
    12. return true;
    13. }

     接下来是完整代码:

    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. typedef long long ll;
    4. ll a,b,k;
    5. ll log(ll x){
    6. ll con=0;
    7. ll ans=1;
    8. while(ans<x){
    9. con++;
    10. ans*=2;
    11. }
    12. return con;
    13. }
    14. bool cheek(ll n){
    15. __int128 ans=1;
    16. for(int i=0;i<a;i++){
    17. ans*=n;
    18. if(ans>k)return false;
    19. }
    20. ll op=log(n);
    21. for(int i=0;i<b;i++){
    22. ans*=op;
    23. if(ans>k)return false;
    24. }
    25. return true;
    26. }
    27. void sove(){
    28. scanf("%lld%lld%lld",&a,&b,&k);
    29. ll l=0,r=1e18;
    30. while(l<r){
    31. ll mid=(l+r+1)/2;
    32. // cout<<"mid=="<<mid<<endl;
    33. if(cheek(mid))l=mid;
    34. else r=mid-1;
    35. // cout<<"l=="<<l<<" r=="<<r<<endl;
    36. }
    37. printf("%lld\n",l);
    38. }
    39. int main(){
    40. int t;
    41. scanf("%d",&t);
    42. while(t--){
    43. sove();
    44. }
    45. return 0;
    46. }

  • 相关阅读:
    神经网络的原理和应用,神经网络理论及应用
    轮胎尺寸后面的91W、101Y是啥意思?解释一下:轮胎载重指数和轮胎速度等级。
    spring @value 注入static 注入静态变量方法
    内网穿透的应用-通过内网穿透快速搭建公网可访问的Spring Boot接口调试环境
    流程自动化
    一次预制体丢失[XX prefab at index n is missing]的排查经历 及 【用代码查找场景中的预制体】
    字典的基本概念
    RabbitMQ 消息丢失解决 (高级发布确认、消息回退与重发、备份交换机)
    三维空间常用函数(二) c++ Qt
    使用Skonsole自动生成Git提交信息
  • 原文地址:https://blog.csdn.net/qq_61903556/article/details/127880153