✏️ 纠错
第 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]的和。
【参考程序】