题目链接https://acm.ecnu.edu.cn/contest/247/problem/E/

这道题是cf原题: Codeforces Round #608 (Div. 2) E. Common Number

Cuber QQ 正在刷 EOJ 上的水题,他正在做的一道题目是这样的。

给定一个正整数 x :

  • 如果 x 是奇数的话,则变幻成 x−1 ;
  • 如果 x 是偶数的话,则变幻成 x*2 。

如此往复地执行这个操作,直到 x 变为 1 。

显然这对于 Cuber QQ 来说过于简单了。于是 Cuber QQ 根据这个发明了一个序列,称为变幻序列, x -变幻序列指的是,从 x 作为变幻的开始,一直变幻到 1 所构成的序列,例如 7 -变幻序列是 {7,6,3,2,1} ; 10 -变幻序列是 {10,5,4,2,1} 。

而现在 Cuber QQ 在纸上写出了所有 1 到 n 变幻序列,他分别统计了每一个数在这些序列中出现的次数,例如当 n=4 的时候,四个序列分别是 [1]={1},[2]={2,1},[3]={3,2,1},[4]={4,2,1} ,则 数 1 出现了 4 次,数 2 出现了 3 次 ,数 3 出现了 1 次 ,数 4 出现了 1 次。

现在 Cuber QQ 想知道最大的数 x 满足 x 在所有 1 到 n 变幻序列中至少出现了 k 次。

输入格式

第一行包含一个整数 T(1≤T≤10^4) ,表示数据组数。

对于每一组数据包含两个整数 n,k(1≤k≤n≤10^18) ,含义如题面所述。

输出格式

对于每一组数据,输出一行一个整数表示答案。

样例

input
4
4 1
4 2
4 3
4 4
output
4
2
2
1
 题意:给定一个 n ,让 1 - n 的每个数进行如上操作得到 n 个集合,问你 n 个集合中数字出现的数字次数 >= k 次的最大数是多少 ?
 
思路:
    我们不难发现,1 出现次数一定为 n 次,2 为 n-1 次,且数字越大出现次数就越小,根据这种性质,我们不难想到 二分答案 check,最后特判一下 二分结果 + 1是否也成立即可(因为我们check() 的是 mid<<1,故二分得到的答案必为偶数,但该偶数可能全部由 +1 的奇数转移过来,此时二分结果 +1 才是正确答案)。
   关于check() 的写法,我们可以发现,被check的数为奇数 x ,那么只能由 x 转移过来,得到的范围为 [ x<<1, x<<1 | 1 ] ;若为偶数,那么可以由 x 和 x+1转移过来,得到的范围为 [ x<<1, (x+1)<<1 | 1],如此递归下去,将答案累加就是 x 的出现次数。
 
代码:
#include <iostream>
#include <queue>
using namespace std;
typedef long long ll; ll t, n, k, l, r, mid, res; bool check(ll x)
{
ll ans = ;
queue<pair<ll, ll>>q;
if (x & ) // 奇数可以只能由 x 转移过来
q.push(make_pair(x, x));
else // 偶数还可以由 x+1 转移过来
q.push(make_pair(x, x + ));
while (!q.empty())
{
auto now = q.front();
q.pop();
ans += min(n, now.second) - now.first + ; //右边界必须在 n 内才有效
if ((now.first << ) <= n)
q.push(make_pair(now.first << , now.second << | )); // 可以转移得到 x 的范围为 [l<<1, r<<1|1]
}
return ans >= k;
} int main()
{
ios::sync_with_stdio(false);
cin >> t;
while (t--)
{
res = ;
cin >> n >> k;
l = , r = (n + ) >> ;
while (l + < r)
{
mid = (l + r) >> ;
if (check(mid << ))
l = mid;
else
r = mid;
}
if (check(l << | )) // 判断结果 +1 是否也成立
res = l << | ;
else
res = l << ;
cout << res << '\n';
}
return ;
}

EOJ Monthly 2020.1 E. 数的变幻的更多相关文章

  1. EOJ Monthly 2019.2 题解(B、D、F)

    EOJ Monthly 2019.2 题解(B.D.F) 官方题解:https://acm.ecnu.edu.cn/blog/entry/320/ B. 解题 单测试点时限: 2.0 秒 内存限制:  ...

  2. 【EOJ Monthly 2018.7】【D数蝌蚪】

    https://acm.ecnu.edu.cn/contest/92/problem/D/ D. 数蝌蚪 Time limit per test: 2.0 seconds Memory limit:  ...

  3. EOJ Monthly 2018.7

    准备继续大学acm啦 又要开始愉快的码码码啦 第一次在华东师大OJ上面做题 看来EOJ上的积分体质是假的,我怎么一把上红??? A.数三角形 神tm的防AK题放在A,出题人很不友好啊... 先写了个暴 ...

  4. EOJ Monthly 2018.4

    A. ultmaster 的小迷妹们 Time limit per test: 2.0 seconds Memory limit: 256 megabytes ultmaster 男神和他的小迷妹们准 ...

  5. EOJ Monthly 2018.11 猜价格 (模拟)

    分三种情况: 1.k=1.此时每次都说反话,反着二分即可. 2.1<k <= n.那么在前n次问答中一定会出现一次错误,通过不断输出1找出那个错误发生的位置(若回答是>那这就是错误) ...

  6. EOJ Monthly 2019.2 (based on February Selection) F.方差

    题目链接: https://acm.ecnu.edu.cn/contest/140/problem/F/ 题目: 思路: 因为方差是用来评估数据的离散程度的,因此最优的m个数一定是排序后连续的,所以我 ...

  7. EOJ Monthly 2019.2 (based on February Selection) D 进制转换 【数学 进制转换】

    任意门:https://acm.ecnu.edu.cn/contest/140/problem/D/ D. 进制转换 单测试点时限: 2.0 秒 内存限制: 256 MB “他觉得一个人奋斗更轻松自在 ...

  8. EOJ Monthly 2019.1 唐纳德先生与这真的是签到题吗 【数学+暴力+multiset】

    传送门:https://acm.ecnu.edu.cn/contest/126/ C. 唐纳德先生与这真的是签到题吗 单测试点时限: 6.0 秒 内存限制: 1024 MB 唐纳德先生在出月赛的过程中 ...

  9. EOJ Monthly 2019.3 A

    A. 钝角三角形 单点时限: 3.0 sec 内存限制: 512 MB QQ 小方以前不会判断钝角三角形,现在他会了,所以他急切的想教会你. 如果三角形的三边长分别为 a, b, c (a≤b≤c), ...

随机推荐

  1. 冰蝎动态二进制加密WebShell基于流量侧检测方案

    概述 冰蝎是一款新型动态二进制加密网站工具.目前已经有6个版本.对于webshell的网络流量侧检测,主要有三个思路.一:webshell上传过程中文件还原进行样本分析,检测静态文件是否报毒.二:we ...

  2. Python调用Windows API函数编写录音机和音乐播放器

    功能描述: 1)使用tkinter设计程序界面: 2)调用Windows API函数实现录音机和音乐播放器. . 参考代码: ​ 运行界面: ​

  3. 吴裕雄--天生自然java开发常用类库学习笔记:IdentityHashMap类

    import java.util.IdentityHashMap ; import java.util.HashMap ; import java.util.Set ; import java.uti ...

  4. UVA - 816 Abbott's Revenge(bfs)

    题意:迷宫从起点走到终点,进入某点的朝向不同,可以出去的方向也不同,输出最短路. 分析:因为朝向决定接下来在该点可以往哪里走,所以每个点需要有三个信息:x,y,d(坐标和进入该点的朝向),所以将起点的 ...

  5. uniapp 小程序实现自定义底部导航栏(tarbar)

    在小程序开发中,默认底部导航栏很难满足实际需求,好在官方给出了自定义形式,效果如下: 话不多说,直接上代码 1.组件 custom-tarbar.vue文件 <template> < ...

  6. mysql 免安装版后续操作

    在安装好mysql后,软件默认的root用户的密码为空. 1.进入mysql 2.创建数据库 3.创建表格 4.插入数据 5.显示数据库.表信息

  7. 基于共享内存、信号、命名管道和Select模型实现聊天窗口

    问题模型 A.B两个进程通过管道通信,A 进程每次接收到的数据通过共享内存传递给A1进程显示,同理,B进程每次接收到的数据通过共享内存传递给B1进程显示: 对于A.B 进程,采用ctrl+c(实际为S ...

  8. pyinstaller打包PySide2写的GUI程序,调用ffmpeg隐藏CMD控制台解决方案

    1 问题描述 使用PySide2写了一个GUI程序,调用ffmpeg命令行工具,做简单的批量视频处理(调整帧宽度.帧高度.视频变速.降低视频码率达到限制视频大小),使用了ffmpeg. ffmpeg- ...

  9. 096-PHP循环使用next取数组元素

    <?php function return_item($arr,$num=0){ //定义函数 for($i=0;$i<$num;$i++){ //循环向前移动数组指针 next($arr ...

  10. Swift 协议protocol

    // associatedtype 关键字 用来声明一个类型的占位符作为协议定义的一部分 protocol LXFViewModelType { associatedtype Input associ ...