• 这是一个lonely的问题——二进制


    这是一个lonely的问题
    好嘞是闺蜜、不好嘞是敌蜜.
    某天你的敌蜜对你施加了魔法,你被困在了数字世界!你变成了一个数字 n.
    你想要逃离这个可怕的世界,回到正常的生活。幸运的是,数字世界有一个神奇的魔法:存在一个数字 k,当你的数值为 2^k 的倍数时,你就可以回到现实世界!

    对于每一秒,你可以使用以下两种操作之一:

    操作一: n=n+1
    操作二: n=n×2
    你想要尽快的逃离数字世界,请你计算出最快的逃离时间,或证明这是一个不可能完成的任务。

    Input
    输入的第一行是一个整数 
    T  (1≤T≤10^5),代表着测试用例的数量。
    接下来的 T 行包含两个正整数 n,k(1≤n≤10^9 , 10≤k≤30),代表含义见上文。

    Output
    对于每组测试用例:
    输出最快的逃离时间 (单位:秒)
    特别的,如果永远不可能逃离,请输出 "lonely".

    样例输入

    3
    1048575 20
    1048576 20
    1 20

    样例输出

    1
    0
    20
     

    解析:

    因为n * 2^k 一定是2的倍数,所以最多进行k次二操作就能使得 n 是 2^k 的倍数。

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. #define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    4. #define int long long
    5. priority_queue<int,vector<int>,greater<int>> ll;
    6. priority_queue<int> rr;
    7. typedef pair<int,int> PII;
    8. const int N=2e6+10;
    9. int n,k,p;
    10. signed main()
    11. {
    12. ios;
    13. int t;
    14. cin>>t;
    15. while (t--)
    16. {
    17. cin>>n>>k;
    18. p=1<<k;
    19. if (n%p==0) cout<<"0\n";
    20. else
    21. {
    22. n %=p;
    23. int ans=p-n; //当枚举二操作次数为0时,需要枚举一操作的总步数
    24. for (int l=1;l<=k;l++)
    25. {
    26. int res=l,now=n;
    27. for (int i=1;i<=l;i++) now=2*now%p;
    28. if (now%p==0) ans=min(ans,res);
    29. else
    30. {
    31. int ss=p-now;
    32. for (int i=l;i>=0;i--) //2^02^k,这些二进制数通过相加,能枚举出 2^02^k 中的每一个数
    33. {
    34. int bb=1<<i;
    35. res +=ss/bb;
    36. ss %=bb;
    37. }
    38. ans=min(ans,res);
    39. }
    40. }
    41. cout<<ans<<endl;
    42. }
    43. }
    44. return 0;
    45. }

  • 相关阅读:
    js真假值
    PMI-ACP练习题(30)
    【qml】性能优化 | 常见的界面元素优化
    _Linux (ipc命令)
    新美域杂志新美域杂志社新美域编辑部2022年第6期目录
    A SOAP 1.2 message is not valid when sent to a SOAP 1.1 only endpoint
    Java基础之《netty(7)—NIO与零拷贝》
    剩余类环上可逆矩阵的计数
    【04】Spring源码-手写篇-手写AOP实现(下)
    Android笔记:监听侧边音量键
  • 原文地址:https://blog.csdn.net/m0_74403543/article/details/134072344