✏️ 纠错
第 149 题 / 共 155 题

题目背景

为保证只有时间复杂度合理的算法通过本题,本题时限下调。

题目描述

如果一个正整数的二进制表示包含奇数个 1,那么小 A 就会认为这个正整数是有趣的。

例如,7 的二进制表示为 (111)2​,包含 1 的个数为 3 个,所以 7 是有趣的。但是 9=(1001)2​ 包含 2 个 1,所以 9 不是有趣的。

给定正整数 l,r,请你统计满足 l≤n≤r 的有趣的整数 n 之和。

输入格式

一行,两个正整数 l,r,表示给定的正整数。

输出格式

一行,一个正整数,表示 l,r 之间有趣的整数之和。

输入输出样例

输入 #1

3 8

输出 #1

19

输入 #2

65 36248

输出 #2

328505490

说明/提示

【数据范围】

对于 40% 的测试点,保证 1≤l≤r≤104。

对于另外 30% 的测试点,保证 l=1 并且 r=2k−1,其中 k 是大于 1 的正整数。

对于所有测试点,保证 1≤l≤r≤109。

【提示】

由于本题的数据范围较大,整数类型请使用 long long。

📝 题目解析

【题目大意】定义“有趣的数”为:二进制表示中1 的个数为奇数。

给定区间[l,r],求所有“有趣的数”的和。数据范围:1≤l≤r≤109不能直接枚举。

【考纲知识点】二进制 位运算

【解题思路】在连续整数区间里,“有趣的数”是有规律的——它们差不多是每隔一个数出现一次,但并不是严格的交替,而是整体上一半的数是“有趣的”。我们可以通过找规律得出,对于区间[0,2k-1]中,“有趣的数”占一半,有2k-1个,而且它们的和等于总和的一半。本题我们要求的是[l-r]之间的“有趣的数“之和,我们可以利用前缀和的思想用[1 - r]的和减去[1 - l-1]的和。

【参考程序】