题意
Link
求
2n∑i=1log2(i∏j=1lowbit(j))
n≤264 .
题解
Update. 好像有更简单做法 .
有趣题 .
首先这个 log 可以丢到里面去吧
2n∑i=1i∑j=1log2(lowbit(j))
然后这个 log2(lowbit(j)) 其实就是 j 二进制中末尾 0 的个数,这个可以通过 lowbit 的定义轻易得到 .
令 ctz(x)=log2(lowbit(x)),于是可以得到
ans=2n∑i=1i∑j=1ctz(j)=2n∑j=12n∑i=jctz(j)=2n∑j=1ctz(j)⋅(2n−j+1)=(2n+1)2n∑i=1ctz(i)+2n∑i=1ictz(i)
然后问题就变成了两个子问题:
- Task 1. ctz(i) 的前缀和 .
- Task 2. ictz(i) 的前缀和 .
考虑这个 ctz 的贡献 .
根据定义可得 [ctz(x)=y]=[(x∣2y)∧(x∤2y+1)]=[x∣2y]⋅[x∤2y+1] .
你也可以通过构造一个树状数组来得到这个形式 .
然后也就是 ctz(x)=y 当且仅当 x 是 2y 的奇数倍(此处是关键结论) .
Task 1.
因为 ∑ 的上界是 2n,可以直接考虑算贡献:
2n∑i=1ctz(i)=n+2n−1∑i=1ctz(i)=n+n−1∑i=0i⋅2n−i−1=n+2n−n−1=2n−1
然后因为这个可以得到直接推论(考虑二进制分解可得):
n∑i=1ctz(i)=n−popcount(n)
其中 popcount(n) 是 n 的二进制中 1 的个数 .
Task 2.
一个 常见的 Trick :
2n∑i=1ictz(i)=2n∑i=1(2n−(2n−i))ctz(i)=2n∑i=12nctz(i)−2n∑i=1(2n−i)ctz(i)=2n2n∑i=1ctz(i)−2n∑i=1i∑j=1ctz(j)=2n⋅(2n−1)−2n∑i=1(i−popcount(i))=2n(2n−1)−122n(2n−1)+2n∑i=1popcount(i)=2n−1(2n−1)+2n∑i=1popcount(i)
现在我们的问题就变成处理 2n∑i=1popcount(i) .
因为 ∑ 的上界是 2n,可以直接考虑直接算贡献:
2n∑i=1popcount(i)=n∑i=0i(ni)=n2n−1
后面是经典组合恒等式 .
然后带回去,就可以得到 2n∑i=1ictz(i)=2n−1(2n+n−1) .
做完了 .
把两个 Task 合起来,回到我们最初的问题 .
ans=(2n+1)2n∑i=1ctz(i)+2n∑i=1ictz(i)=(2n+1)(2n−1)−2n−1(2n+n−1)
化简是不可能化的,这辈子也不可能化的
快速幂,O(logn) .
因为 n 非常的大,我们对指数用费马小定理取模 109+6 即可 .
注意 n 有的在指数上有的在底下,不要直接取模了 .
实际实现的时候其实只需要一次快速幂 .
Record ID : 73251352 .
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】