题目链接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. 洛谷 P1247 取火柴游戏

    题目传送门 暴力 \((\)由于我这样的初中蒟蒻不\((bu)\)喜\((hui)\)欢\((xie)\)数学证明,所以题解中的证明全是其他大佬的题解已经多次证明过的,这里就不再啰嗦了.\()\) - ...

  2. uboot源码分析2-启动第二阶段

    一.背景知识 1.uboot第二阶段应该做什么? 概括来讲uboot第一阶段主要就是初始化了SoC内部的一些部件(譬如看门狗.时钟),然后初始化DDR并且完成重定位. 由宏观分析来讲,uboot的第二 ...

  3. Day6 - F - KiKi's K-Number HDU - 2852

    For the k-th number, we all should be very familiar with it. Of course,to kiki it is also simple. No ...

  4. Webstorm常用快捷键备忘

    WebStorm 是jetbrains公司旗下一款JavaScript 开发工具.被广大中国JS开发者誉为“Web前端开发神器”.“最强大的HTML5编辑器”.“最智能的JavaSscript IDE ...

  5. CPU各个具体的指标含义

    CPU各个具体的指标含义解释如下: ①CPU(监测到的master主机上的CPU使用情况) 从图中看出,一共有五个关于CPU的指标.分别如下: 1. User User表示:CPU一共花了多少比例的时 ...

  6. Django 项目搭建

    django(mvt结构) 虚拟环境 创建虚拟环境 mkvirtualenv django_py3 -p python3 切换虚拟环境 wokeon 虚拟环境名称 删除虚拟环境 rmvirtualen ...

  7. HDU - 6205 card card card (尺取法)

    题意:有n堆牌,ai表示每堆牌的牌数,bi表示每堆牌的penaltyvalue,操作开始前,可以重复进行将第一堆牌挪到最后一堆这一操作.然后,对于挪完后的牌,从第一堆开始,依次取.对于每一堆牌,首先将 ...

  8. HDU 5501:The Highest Mark 01背包

    The Highest Mark  Accepts: 71  Submissions: 197  Time Limit: 2000/1000 MS (Java/Others)  Memory Limi ...

  9. 20170430深圳Meetup

    一.类似于淘宝网,可以连续选择多个商品筛选条件,这多个参数如何传递到后台,进行数据交互? 方案一: def index // 给view提供多个参数 @param1 = ... @param2 = . ...

  10. JDK源码阅读-------自学笔记(一)(java.lang.Object重写toString源码)

    一.前景提要 Object类中定义有public String toString()方法,其返回值是 String 类型. 二.默认返回组成 类名+@+16进制的hashcode,当使用打印方法打印的 ...