CF1605F PalindORme
不知道是怎么想到的。ntf 实在是不平凡的。/bx/bx/bx
你考虑如何判断一个序列是 的。设重排后序列 前缀 和后缀 按位或等于 , 和 按位或等于 。不难发现 ,这说明 和 的对称差对应的那些位上, 和 均为 。于是扔掉顺序,就变成了 里面任取两个数 ,令 为它们去掉当前按位或值 是 的位的值,那么 ,再将 。
合法的序列一定会判断合法,因为每步中满足条件的 ,如果它们没有被选,那么接下来选数时 仍然合法。并且一定可以从一个不合法的序列中拆出一个合法的子序列,而且去掉这个子序列的或和为 的位之后,剩下来的数互不相同。
为了避免算重,如果剩下的数中有 ,我们将其算进合法子序列内。
然后就可以数数了。设 为长度为 ,按位或的 为 的不合法序列的方案数。答案枚举 求和即可。每次转移就枚举其合法子序列的长度以及值域(因为合法子序列的或值上的 可以全部去除),显然:
其中 表示长度 ,值域 的序列,按位或和为 的序列个数。 表示长度 ,值域 的序列,每个位置上的值互不相同,按位或和为 的序列个数。 就是合法子序列的个数,然后任取 个位置和 个二进制位。最后要求 个数要互不相同,而且对于 为 的位,不合法的部分的数可以任选,所以乘上 。
至于如何计算 ,根据二项式反演(钦定一些位为 ):
做完了,复杂度 。
upd : 详细证一下最后那个式子。
考虑计算 ,首先令 为长度 ,值域 随便选的方案。显然 。
考虑选出 位,使得或起来后这些位为 ,其它全是 。去掉其它位后,只剩 位,所以方案数就是 。
那么枚举 :
其实本质是容斥,二项式反演即可。 同理。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话