当前位置:网站首页>AT2382-[AGC015D]A or...or B Problem
AT2382-[AGC015D]A or...or B Problem
2022-08-08 14:21:00 【QuantAsk】
正题
题目链接:https://www.luogu.com.cn/problem/AT2382
题目大意
询问在 [ L , R ] [L,R] [L,R]中选取一个或多个数,将它们按位或后能得到多少种不同的结果。
1 ≤ L ≤ R < 2 60 1\leq L\leq R<2^{60} 1≤L≤R<260
解题思路
我们先把高位的 L L L和 R R R都有的 1 1 1都删除,因为它们之间的数都有这些 1 1 1,显然没有用。
那么这样 L L L和 R R R的最高位就不同了,我们找到 R R R的最高位 2 k 2^k 2k。
此时对于 [ L , 2 k ) [L,2^k) [L,2k)中的数字都在 L L L中,而且它们怎么或都不能超过 2 k 2^k 2k,所以这部分的答案就是 2 k − L 2^k-L 2k−L。
然后让这部分的数或上 2 k 2^k 2k,此时我们就有两个部分 [ 2 k , R ] [2^k,R] [2k,R]和 [ L + 2 k , 2 k − 1 ) [L+2^k,2^{k-1}) [L+2k,2k−1)的数字。
先令 L = L + 2 k − 1 L=L+2^{k-1} L=L+2k−1,然后我们分类讨论一下:
- R ≥ L − 1 R\geq L-1 R≥L−1:此时 [ 2 k , 2 k − 1 ) [2^k,2^{k-1}) [2k,2k−1)都能直接有。
- R ≥ 2 k + 2 k − 1 R\geq 2^k+2^{k-1} R≥2k+2k−1:此时第 k − 1 k-1 k−1位为 0 0 0的数都存在,然后我们让这一部分数或上 2 k + 2 k − 1 2^k+2^{k-1} 2k+2k−1,那也能得到所有第 k − 1 k-1 k−1位为 1 1 1的数,所以同上。
- L < 2 k + 2 k − 1 L<2^k+2^{k-1} L<2k+2k−1:此时 k − 1 k-1 k−1位为 1 1 1的数都可以得到,继续考虑 k − 1 k-1 k−1位为 0 0 0,对 k − 2 k-2 k−2位同上分类讨论即可。
- R < 2 k + 2 k − 1 , L ≥ 2 k + 2 k − 1 R<2^k+2^{k-1},L\geq 2^{k}+2^{k-1} R<2k+2k−1,L≥2k+2k−1:此时对于 k − 1 k-1 k−1位为 1 1 1的部分我们显然不可能异或出比 L L L小的数字,而比其大的数字都在,所以这部分答案是 2 k − L 2^{k}-L 2k−L,对 [ 2 k , R ] [2^{k},R] [2k,R]重新做一次上面的操作就好了。
时间复杂度: O ( log 2 n ) O(\log^2 n) O(log2n)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll A,B,ans;
signed main()
{
scanf("%lld%lld",&A,&B);
while(1){
if(B<=1){
ans+=B-A+1;
printf("%lld\n",ans);
return 0;
}
ll k=1ll;
while(k*2ll<=B)k=k*2ll;
if((A&k)&&(B&k))
{
A-=k,B-=k,k/=2ll;continue;}
ans+=k-A;B-=k;k/=2ll;swap(A,B);
while(k){
if(A>B||A>=k){
ans+=k*2ll;
printf("%lld\n",ans);
return 0;
}
if(B<k)ans+=k,k/=2ll;
else{
ans+=k*2ll-B;
B=A;A=0;
break;
}
}
}
printf("%lld\n",ans);
return 0;
}
边栏推荐
猜你喜欢
随机推荐
6.【opencv鼠标回调事件】
【小码匠自习室】ABC258-A 代码写的啰嗦了
TCP补充
Shell Three Musketeers-----sed command
【个人总结】2022.8.7周结
poj3744 Scout YYF I
【小码匠自习室】[NOI Online 2020-2 入门组] 未了:可恶的精度会让你焦头烂额
【电路基础2】电容
线程的状态简介说明
非科班毕业生,五面阿里:四轮技术面+HR一面已拿offer
年初离职,学习半年源码,终于拿到了蚂蚁Offer,分享面试过程
基于FPGA的FIR滤波器的实现(1)—采用fir1函数设计
See how three years of CRUD programmers solve database deadlocks
兔起鹘落全端涵盖,Go lang1.18入门精炼教程,由白丁入鸿儒,全平台(Sublime 4)Go lang开发环境搭建EP00
【低代码】1405- 浅谈低代码平台远程组件加载方案
路由器——交换机——网络交换机:区别
医学图像数据增强-重采样itk
【小码匠自习室】CSP-J/S复试高分秘诀经验分享
【小码匠自习室】叛逆的小孩,打死也不改
flink知识