给定 l 和 r,找到从 l 到 r 的按位与等于 0 的自然数对的数量。
限制:
1 <= l <= r <= 10^9
r - l <= 10^6
我只能写一个蛮力。有谁知道如何解决这个任务?范围大小最大为 10^6,因此我们可以以某种方式使用它。
给定 l 和 r,找到从 l 到 r 的按位与等于 0 的自然数对的数量。
限制:
1 <= l <= r <= 10^9
r - l <= 10^6
我只能写一个蛮力。有谁知道如何解决这个任务?范围大小最大为 10^6,因此我们可以以某种方式使用它。
首先编写如下函数:
你可以用关于位的观点来写它 - 你只需找到可以在范围内工作的最大非零位,删除必须为 0 的位,然后你就得到了比满足的 and 的数量少 1 的基数 2 表示条件。(计数技巧落空了
0
。)现在我们使用以下事实。假设
x & y == 0
. 然后:(2*x) & (2*y) == 0
(2*x + 1) & (2*y) == 0
(2*x) & (2*y + 1) == 0
但是
(2*x + 1) & (2*y + 1) == 1
。l
因此,我们可以将到 的大部分范围配对,去掉和 的r
底部位以获得更小的范围,计算该范围的与,然后乘以 3。我们还必须小心边界。所以我们得到这样的东西:l
r
这只是对一个微不足道的范围进行 20 次递归调用。所以它应该是相当快的。