题目大意

求一个正整数集合\(K\),使得\(\sum_{k\in K}2^k\in[A,B]\),且\(|K|\)最大。\(A,B\)大小在long long范围内。

思路

\(\sum_{k\in K}2^k\)?这不就是一个二进制数,对于该数上的每一个数位\(k\),若\(k\in K\),则该数位上的数为1,否则为0么?

所以原题就变成了:求一个整数\(x\),使得\(x\in[A,B]\),且其用二进制表示的1的个数最多。

怎么求这个\(x\)呢?

  1. 若\(A,B\)二进制最高位数不同,则结果为\(A\)最高位数-1。如\(A=(10100)_2,B=(101)_2\),则结果为4,因为\((1111)_2\)。
  2. 满足情况1时的特殊情况。若\(A\)用二进制表示全是1,则结果为情况1的结果加1.如\(A=(11111)_2,B=(101)_2\),则结果为5,因为\((11111)_2\)。
  3. 若最高位数相同,则把两个数的最高位去掉,转化为子问题,再在此基础上+1.如:\(A=(110100)_2,B=(100101)_2\),则结果为5,因为把两个数最高位的1去掉就成了情况1的例子,再在此基础上+1便是。

注意

  • 因为A、B是long long,所以不能直接用1进行左移操作(因为默认的结果是int)。
  • 递归时,当A、B都是0时要提前跳出。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cassert>
using namespace std; #define ll long long int GetHighbitPos(ll x)
{
int ans = -1;
while (x)
{
ans++;
x >>= 1;
}
return ans;
} ll All(int n)
{
ll x = 1;
return (x << n + 1) - 1;
} ll Erase(ll x, int pos)
{
ll t = 1;
return x & ~(t << pos);
} int Dfs(ll below, ll above)
{
if (above == 0)
return 0;
int pa = GetHighbitPos(above), pb = GetHighbitPos(below), ans;
assert(pa >= pb);
if (pa > pb)
{
ans = pa;
if (above == All(pa))
ans++;
return ans;
}
else
return 1 + Dfs(Erase(below, pb), Erase(above, pa));
} int main()
{
ll below, above;
cin >> below >> above;
cout << Dfs(below, above) << endl;
}

最新文章

  1. 单例模式 - Singleton
  2. extjs4 各种怪异问题
  3. 火车头wordpress免费万能发布模块和接口
  4. SQL Server 2008通过LinkServer操作ORACLE
  5. supervisor安装配置与使用
  6. MyBatis 入门
  7. iOS - 3DTouch 3D 触摸
  8. Qt之QSizePolicy
  9. 关于“无法解析的外部符号”和“该符号在函数_wmain 中被引用”的问题
  10. IOS开发之Cocoa编程—— NSUndoManager
  11. quartz群调查调度机制和源代码分析
  12. OUC_OptKernel_oshixiaoxiliu_好题推荐
  13. 用DirectDraw封装的位图动画类
  14. Android studio的错误:radle sync failed: Cause: failed to find target android-21 :
  15. tomcat发布项目如何通过域名直接访问
  16. Could not resolve all dependencies for configuration &#39;:classpath&#39;
  17. 注解@RestController与@Controller的区别
  18. Android的Fragment中的互相通信-桥梁activity
  19. winform嵌入word解决方案一
  20. 进程状态TASK_UNINTERRUPTIBLE

热门文章

  1. Windows phone开发 页面布局之屏幕方向
  2. jQuery学习笔记之jQuery的Ajax(3)
  3. 解决Latex复制到公众号可能报“图片粘贴失败”的问题
  4. for 循环 乘法口诀表
  5. three.js 流程图
  6. python爬虫:找房助手V1.0-爬取58同城租房信息
  7. Clustered Index Scan 与 Clustered Index Seek
  8. 【sqli-labs】 less23 Error based - strip comments (GET型基于错误的去除注释的注入)
  9. 前端工具gulp2
  10. android studio: 为现有项目添加C++支持