AOJ 2539 Counting 1's

这是一道关于寻找特定区间内二进制位为1的数量的数学问题。题目要求在区间[A, B]中(1 <= A, B <= 1e18),确定是否存在区间满足从后往前的第i位1的个数为k[i]。通过分析,可以得出区间长度W的三种可能:2*k[0]-1, 2*k[0], 或 2*k[0]+1。通过枚举这三种情况,并检查每个位上的四种可能性(0, W, 0 < k[i] < W, k[i] > W),可以判断是否存在唯一解、多解或无解。具体解决策略包括分析边界情况并利用位运算求解符合条件的A和B。" 108478563,10073952,C语言中的getopt()与getopt_long()函数解析,"['C语言', 'Linux']
摘要由CSDN通过智能技术生成


Aizu 2539

题意:询问是否存在区间[A,B],使得[A,B]之间,从后往前二进制第i位为1的数个数为k[i]。(1<=A,B<=1e18)

要求判断无解,多解或者确定唯一解。


非常有趣的思想题,我们设区间大小W=B-A+1,注意到k[0],也就是最后一位二进制可以将W的范围约束住。

一共有三种情况:

W=2*k[0]-1

W=2*k[0]

W=2*k[0]+1

所以我们分别对三种W进行判断即可。

如何计算:从最高位开始往低位走,显然对于确定的W,k[i]有四种可能性:

k[i]=0

k[i]=W

0<k[i]<W

k[i]>W

第一种情况,在[A,B]之间没有任何数第i位为1,所以显然A,B在这一位上都是0。

第二种情况,所有[A,B]之间的数都是1,所以A,B在这一位上都是1。

第三种情况,表示了A在这一位上是0,而B在这一位上是1。

第四种情况,情况不合法。


现在我们单独讨论第三种情况:

假设当前

A=0b000101

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值