CF1605F PalindORme

不知道是怎么想到的。ntf 实在是不平凡的。/bx/bx/bx

你考虑如何判断一个序列是 good 的。设重排后序列 ti 前缀 [1,i] 和后缀 [ni+1,n] 按位或等于 w1[1,i+1][ni,n] 按位或等于 w2。不难发现 w1w2,这说明 w2w1对称差对应的那些位上,ti+1tni 均为 1。于是扔掉顺序,就变成了 bi 里面任取两个数 x,y,令 x,y 为它们去掉当前按位或值 V1 的位的值,那么 x=y,再将 VVor x

合法的序列一定会判断合法,因为每步中满足条件的 x,y,如果它们没有被选,那么接下来选数时 x,y 仍然合法。并且一定可以从一个不合法的序列中拆出一个合法的子序列,而且去掉这个子序列的或和为 1 的位之后,剩下来的数互不相同

为了避免算重,如果剩下的数中有 0,我们将其算进合法子序列内。

然后就可以数数了。设 dpi,j 为长度为 i,按位或的 popcountj不合法序列的方案数。答案枚举 j 求和即可。每次转移就枚举其合法子序列的长度以及值域(因为合法子序列的或值上的 1 可以全部去除),显然:

dpi,j=p[0,i),q[0,j)(gp,qdpp,q)(ip)(jq)2(ip)qfip,jq

其中 gi,j 表示长度 i,值域 [0,2j) 的序列,按位或和为 2j1 的序列个数。fi,j 表示长度 i,值域 [1,2j) 的序列,每个位置上的值互不相同,按位或和为 2j1 的序列个数。gp,qdpp,q 就是合法子序列的个数,然后任取 p 个位置和 q 个二进制位。最后要求 ip 个数要互不相同,而且对于 V1 的位,不合法的部分的数可以任选,所以乘上 2(ip)q

至于如何计算 f,g,根据二项式反演(钦定一些位为 1):

fi,j=k=0j(jk)(1)jk(2k1)i_

gi,j=k=0j(jk)(1)jk(2k)i

做完了,复杂度 O(n2k2)

评测记录。


upd : 详细证一下最后那个式子。

考虑计算 g,首先令 ti,j 为长度 i,值域 2j1 随便选的方案。显然 ti,j=2ij

考虑选出 k 位,使得或起来后这些位为 1,其它全是 0。去掉其它位后,只剩 k 位,所以方案数就是 gi,k

那么枚举 k

ti,j=k=0j(jk)gi,k

其实本质是容斥,二项式反演即可。f 同理。

posted @   Arghariza  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示
主题色彩