洛谷 P5627 题解

题意

Link


i=12nlog2(j=1ilowbit(j))

n264 .

题解

Update. 好像有更简单做法 .

有趣题 .

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

i=12nj=1ilog2(lowbit(j))

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

ctz(x)=log2(lowbit(x)),于是可以得到

ans=i=12nj=1ictz(j)=j=12ni=j2nctz(j)=j=12nctz(j)(2nj+1)=(2n+1)i=12nctz(i)+i=12nictz(i)

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

  • Task 1. ctz(i) 的前缀和 .
  • Task 2. ictz(i) 的前缀和 .

考虑这个 ctz 的贡献 .

根据定义可得 [ctz(x)=y]=[(x2y)(x2y+1)]=[x2y][x2y+1] .

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

然后也就是 ctz(x)=y 当且仅当 x2y 的奇数倍(此处是关键结论) .


Task 1.

因为 的上界是 2n,可以直接考虑算贡献:

i=12nctz(i)=n+i=12n1ctz(i)=n+i=0n1i2ni1=n+2nn1=2n1

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

i=1nctz(i)=npopcount(n)

其中 popcount(n)n 的二进制中 1 的个数 .

Task 2.

一个 常见的 Trick :

i=12nictz(i)=i=12n(2n(2ni))ctz(i)=i=12n2nctz(i)i=12n(2ni)ctz(i)=2ni=12nctz(i)i=12nj=1ictz(j)=2n(2n1)i=12n(ipopcount(i))=2n(2n1)122n(2n1)+i=12npopcount(i)=2n1(2n1)+i=12npopcount(i)

现在我们的问题就变成处理 i=12npopcount(i) .

因为 的上界是 2n,可以直接考虑直接算贡献:

i=12npopcount(i)=i=0ni(ni)=n2n1

后面是经典组合恒等式 .

然后带回去,就可以得到 i=12nictz(i)=2n1(2n+n1) .


做完了 .

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

ans=(2n+1)i=12nctz(i)+i=12nictz(i)=(2n+1)(2n1)2n1(2n+n1)

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

快速幂,O(logn) .

因为 n 非常的大,我们对指数用费马小定理取模 109+6 即可 .

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

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

Record ID : 73251352 .

posted @   yspm  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
😅​
点击右上角即可分享
微信分享提示