洛谷 P5627 题解

题意

Link


\[\sum_{i=1}^{2^n}\log_2\left(\prod_{j=1}^i\operatorname{lowbit}(j)\right) \]

\(n\le 2^{64}\) .

题解

Update. 好像有更简单做法 .

有趣题 .

首先这个 \(\log\) 可以丢到里面去吧

\[\sum_{i=1}^{2^n}\sum_{j=1}^i\log_2(\operatorname{lowbit}(j)) \]

然后这个 \(\log_2(\operatorname{lowbit}(j))\) 其实就是 \(j\) 二进制中末尾 \(0\) 的个数,这个可以通过 \(\operatorname{lowbit}\) 的定义轻易得到 .

\(\operatorname{ctz}(x)=\log_2(\operatorname{lowbit}(x))\),于是可以得到

\[\begin{aligned}ans&=\sum_{i=1}^{2^n}\sum_{j=1}^i\operatorname{ctz}(j)\\&=\sum_{j=1}^{2^n}\sum_{i=j}^{2^n}\operatorname{ctz}(j)\\&=\sum_{j=1}^{2^n}\operatorname{ctz}(j)\cdot(2^n-j+1)\\&=(2^n+1)\sum_{i=1}^{2^n}\operatorname{ctz}(i)+\sum_{i=1}^{2^n}i\operatorname{ctz}(i)\end{aligned} \]

然后问题就变成了两个子问题:

  • Task 1. \(\operatorname{ctz}(i)\) 的前缀和 .
  • Task 2. \(i\operatorname{ctz}(i)\) 的前缀和 .

考虑这个 \(\operatorname{ctz}\) 的贡献 .

根据定义可得 \([\operatorname{ctz}(x)=y]=[(x\mid2^y)\land (x\nmid 2^{y+1})]=[x\mid 2^y]\cdot[x\nmid 2^{y+1}]\) .

你也可以通过构造一个树状数组来得到这个形式 .

然后也就是 \(\operatorname{ctz}(x)=y\) 当且仅当 \(x\)\(2^y\) 的奇数倍(此处是关键结论) .


Task 1.

因为 \(\sum\) 的上界是 \(2^n\),可以直接考虑算贡献:

\[\begin{aligned}\sum_{i=1}^{2^n}\operatorname{ctz}(i)&=n+\sum_{i=1}^{2^n-1}\operatorname{ctz}(i)\\&=n+\sum_{i=0}^{n-1}i\cdot2^{n-i-1}\\&=n+2^n-n-1\\&=2^n-1\end{aligned} \]

然后因为这个可以得到直接推论(考虑二进制分解可得):

\[\sum_{i=1}^n\operatorname{ctz}(i)=n-\operatorname{popcount}(n) \]

其中 \(\operatorname{popcount}(n)\)\(n\) 的二进制中 \(1\) 的个数 .

Task 2.

一个 常见的 Trick :

\[\begin{aligned}\sum_{i=1}^{2^n}i\operatorname{ctz}(i)&=\sum_{i=1}^{2^n}(2^n-(2^n-i))\operatorname{ctz}(i)\\&=\sum_{i=1}^{2^n}2^n\operatorname{ctz}(i)-\sum_{i=1}^{2^n}(2^n-i)\operatorname{ctz}(i)\\&=2^n\sum_{i=1}^{2^n}\operatorname{ctz}(i)-\sum_{i=1}^{2^n}\sum_{j=1}^{i}\operatorname{ctz}(j)\\&=2^n\cdot(2^n-1)-\sum_{i=1}^{2^n}(i-\operatorname{popcount}(i))\\&=2^n(2^n-1)-\dfrac122^n(2^n-1)+\sum_{i=1}^{2^n}\operatorname{popcount}(i)\\&=2^{n-1}(2^n-1)+\sum_{i=1}^{2^n}\operatorname{popcount}(i)\end{aligned} \]

现在我们的问题就变成处理 \(\displaystyle\sum_{i=1}^{2^n}\operatorname{popcount}(i)\) .

因为 \(\sum\) 的上界是 \(2^n\),可以直接考虑直接算贡献:

\[\begin{aligned}\sum_{i=1}^{2^n}\operatorname{popcount}(i)&=\sum_{i=0}^ni\dbinom ni\\&=n2^{n-1}\end{aligned} \]

后面是经典组合恒等式 .

然后带回去,就可以得到 \(\displaystyle \sum_{i=1}^{2^n}i\operatorname{ctz}(i)=2^{n-1}(2^n+n-1)\) .


做完了 .

把两个 Task 合起来,回到我们最初的问题 .

\[\begin{aligned}ans&=(2^n+1)\sum_{i=1}^{2^n}\operatorname{ctz}(i)+\sum_{i=1}^{2^n}i\operatorname{ctz}(i)\\&=(2^n+1)(2^n-1)-2^{n-1}(2^n+n-1)\end{aligned} \]

化简是不可能化的,这辈子也不可能化的

快速幂,\(O(\log n)\) .

因为 \(n\) 非常的大,我们对指数用费马小定理取模 \(10^9+6\) 即可 .

注意 \(n\) 有的在指数上有的在底下,不要直接取模了 .

实际实现的时候其实只需要一次快速幂 .

Record ID : 73251352 .

posted @ 2022-04-08 11:36  Jijidawang  阅读(42)  评论(0编辑  收藏  举报
😅​