个人感觉还是挺简单的
作为一个彩笔,肯定没有大佬那么聪明的智慧,所以我先对式子进行了变形。
i=1∑nj=1∑i−1i⊕j∈[j,i]
很自然的感觉,应该对于一个
i,后面的的
∑j=1i−1i⊕j∈[j,i] 应该存在一个式子可以等价。
因为是异或操作很容易想到观察二进制。
首先发现如果
i 和
j 存在相同的位数(这里指的是二进制下的)。那么无论如和
i⊕j 的这一位都是零,肯定无法
≥j。所以对于
j,位数一定小于
i。而后我们再往下考虑下一个一,如果这一位填了一,那么之后的所有都可以随便填,假如这是第
x 位,那么贡献为
2x,之后也是,所以一个数的贡献是
i−2high(i)。
2i=1∑n(i−2high(i))
记
hp(i)=2high(i)。
2i=1∑n(i−hp(i))=2(i=1∑ni−i=1∑nhp(i)).
原式化为
n(n+1)−2i=1∑nhp(i).
剩下的核心问题是计算
Shp(n)=∑i=1nhp(i)。
令
m=⌊log2n⌋,即满足
注意:在区间
[2k,2k+1−1] 上的每个整数的最高位对应的
hp(i) 都等于
2k。该区间包含的整数个数是
2k。因此,这一整段对和的贡献为
(个数 2k)×(每个 hp=2k)=2k⋅2k=4k.
把所有完整的区间从
k=0 算到
k=m−1,再加上最后不满的那一段(最高位为
2m 的数):
- 对于 k=0,1,…,m−1:贡献总和为 ∑k=0m−14k。
- 对于最高位为 2m 的那段:这些数是从 2m 到 n,共有 n−2m+1 个,每个的 hp 都是 2m,贡献为 2m⋅(n−2m+1)。
因此
i=1∑nhp(i)=k=0∑m−14k+2m(n−2m+1).
k=0∑m−14k=k=0∑m−14k=4−14m−1=34m−1
因此
i=1∑nhp(i)=34m−1+2m(n−2m+1)