题目链接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. 关于AlertDialog多选框中全选和反选的实现办法

    package mobile.android.ch07.multi.choice.dialog; import android.app.Activity; import android.app.Ale ...

  2. html基础与入门

    html就是指一个html文件,它是由各种标签组成的 html分为 < !DOCTYPE html > 和 Head 和 Body Head title+meta+link+style B ...

  3. PowerShell中执行.net类库

    Powershell脚本一个比较强大的功能是可以直接调用.net类库(ps core能调用.net core类库),除了调用系统类库外,也可以调用自己编写的类库,从而扩充我们脚本的功能.本文这里简单的 ...

  4. css3的伪(伪类和伪元素)大合集

    本文讲css3的伪,不是讲它有多虚伪,而是说它的伪元素样式.不得不说以前虽知html伪元素,但很少用,后得知借助css3伪元素可以发挥极大的便利.故总结css3的伪如下: CSS中存在一些比较特殊的属 ...

  5. putty Linux 自动补全

    用putty连接Ubuntu16.04后,输入命令后按tab键,不自动补全,对上下键无历史命令,$符号顶格显示,无用户名.主机名, 这是由于默认用的sh,可以直接调用bash,进入bash:

  6. 吴裕雄--天生自然java开发常用类库学习笔记:对象克隆技术

    class Person implements Cloneable{ // 实现Cloneable接口表示可以被克隆 private String name ; public Person(Strin ...

  7. G. Repeat it

    G. Repeat it time limit per test 2.0 s memory limit per test 64 MB input standard input output stand ...

  8. 剑指offer自学系列(四)

    题目描述: 输入一个正整数数组,把数组里面所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个,例如输入数组{3,32,321},输出的最小数字为321323 题目分析: 如果采用穷举法,把 ...

  9. 20170430深圳Meetup

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

  10. 18.swoole学习笔记--案例

    <?php //创建webSocket服务器 $ws=); //open $ws->on('open',function($ws,$request){ echo "新用户 $re ...