传送门

还是看题解的啦

先考虑一个显而易见的结论:A和B二进制下最高的几位相同是没用的(设去掉的那些位之和为sum)

然后我们设\(d\)为二进制下从高位到低位第一位不相同的,\(k\)为B从高位到低位第二个不为0的

然后我们分几段来统计答案

首先,\([A,2^d-1+sum]\)显然是可以凑出来的

然后,考虑\(k\),发现\([2^d+sum,2^d+2^{k+1}+sum-1]\)也是可以凑出来的

最后,我们发现还有一种情况漏算了,确定\(d\),所以区间就是\([A+2^d,sum+2^{d+1}]\)

求并就好啦

讲的好乱啊,应该只有我一个人会来看吧

代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
void read(long long &x){
char ch;bool ok;
for(ok=0,ch=getchar();!isdigit(ch);ch=getchar())if(ch=='-')ok=1;
for(x=0;isdigit(ch);x=x*10+ch-'0',ch=getchar());if(ok)x=-x;
}
#define rg register
const int maxn=110;
long long a,b,x,y,l,r,ans,ll,rr;
int aa[maxn],bb[maxn],lena,lenb,len,k;
int main(){
read(a),read(b);x=a,y=b;
while(a)aa[++lena]=a&1,a>>=1;
while(b)bb[++lenb]=b&1,b>>=1;
for(rg int i=max(lena,lenb);i;i--){
if(aa[i]!=bb[i]){len=i;break;}
x-=1ll*aa[i]<<(i-1);
y-=1ll*bb[i]<<(i-1);
}
for(rg int i=len-1;i;i--)if(bb[i]){k=i;break;}
l=x,r=(1ll<<(len-1))+(1ll<<k)-1;
ll=(1ll<<(len-1))+x,rr=(1ll<<len)-1;
if(ll>r)ans=r-l+1+rr-ll+1;
else ans=rr-l+1;
printf("%lld\n",ans);
}

最新文章

  1. WinForm 对Web Api 增 册 改 查 的基本操作
  2. androi手机解锁引导程序
  3. Atitit 编程语言常用算法attilax总结
  4. 省选模拟赛 project
  5. 基于UML项目的分析与设计
  6. thinkphp的mvc理解
  7. 一个noconsole程序
  8. jquery动态加载JS【方法getScript】的改进
  9. C++ 文件读写方案选型
  10. 【HDOJ】4326 Game
  11. 杭州电 3711 Binary Number
  12. LeetCode OJ 235. Lowest Common Ancestor of a Binary Search Tree
  13. Nmap脚本引擎原理
  14. 浅拷贝 &amp;&amp;&amp;深拷贝 实现
  15. PHP快速排序(递归)
  16. 【转载】 禁止国外IP访问你的网站
  17. 理一下docker在各平台上的运行机制
  18. vue 路由参数变化,页面不更新的问题
  19. 关于Entity Framework的概念及搭建
  20. Centos6下Python3的编译安装

热门文章

  1. Android 内存监测工具 DDMS --&gt; Heap
  2. HNOI2008玩具装箱 斜率优化
  3. ACM学习历程—HDU 3949 XOR(xor高斯消元)
  4. redis源码笔记 - redis-cli.c
  5. 1. Two Sum[LeetCode 简单 by 大志]
  6. POJ2080:Calendar(计算日期)
  7. JVM体系结构之五:本地方法栈
  8. JAVA基础知识(12)-----同步
  9. django examples 学习笔记(1)创建一个独立的python环境
  10. JavaScript之闭包(重新认识)