洛谷 P5627 题解
题意
求
\(n\le 2^{64}\) .
题解
Update. 好像有更简单做法 .
有趣题 .
首先这个 \(\log\) 可以丢到里面去吧
然后这个 \(\log_2(\operatorname{lowbit}(j))\) 其实就是 \(j\) 二进制中末尾 \(0\) 的个数,这个可以通过 \(\operatorname{lowbit}\) 的定义轻易得到 .
令 \(\operatorname{ctz}(x)=\log_2(\operatorname{lowbit}(x))\),于是可以得到
然后问题就变成了两个子问题:
- 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\),可以直接考虑算贡献:
然后因为这个可以得到直接推论(考虑二进制分解可得):
其中 \(\operatorname{popcount}(n)\) 是 \(n\) 的二进制中 \(1\) 的个数 .
Task 2.
一个 常见的 Trick :
现在我们的问题就变成处理 \(\displaystyle\sum_{i=1}^{2^n}\operatorname{popcount}(i)\) .
因为 \(\sum\) 的上界是 \(2^n\),可以直接考虑直接算贡献:
后面是经典组合恒等式 .
然后带回去,就可以得到 \(\displaystyle \sum_{i=1}^{2^n}i\operatorname{ctz}(i)=2^{n-1}(2^n+n-1)\) .
做完了 .
把两个 Task 合起来,回到我们最初的问题 .
化简是不可能化的,这辈子也不可能化的
快速幂,\(O(\log n)\) .
因为 \(n\) 非常的大,我们对指数用费马小定理取模 \(10^9+6\) 即可 .
注意 \(n\) 有的在指数上有的在底下,不要直接取模了 .
实际实现的时候其实只需要一次快速幂 .
Record ID : 73251352 .
以下是博客签名,正文无关
本文来自博客园,作者:Jijidawang,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/16116144.html
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ