对一类异或和计数问题的探讨
对一类异或和计数问题的探讨
by AmanoKumiko
起因是 ABC288Ex,简短的题目让我从中受益很多。
该计数问题一共有三种模型。
分别是:
1. 个数的序列,每个数在 上,求异或和为 的方案数,设为 。
2. 个数的集合,每个数在 上,求异或和为 的方案数,设为 。
3. 个数的多重集合,每个数在 上,求异或和为 的方案数,设为 。
模型三
模型三和模型二之间有明显的关系,因为只要对第二种卷上一个 就行了。
接下来转化为每个数至多出现一次,也就是模型二的问题。
模型二
我们知道,模型一显然是一个更加可做的问题,但是缺乏模型一和二之间的对应。
不妨先假设模型二是有序序列,最后只需除掉一个阶乘。
然后考虑在模型一上容斥。
具体来说,是集合划分容斥。
我们有恒等式:
证明也不难,因为这相当于枚举圆排列,反演一下就得证了。
现在只需强制让每个集合内的数相同,集合之间不用管。
显然只有奇数大小的集合会有贡献,而其正好就是模型一中的问题。
接下来有两条路。
第一种适用于求所有项。
设 表示大小为的序列, 种数出现了奇数次, 种数出现了偶数次的方案数。
那么
也就是枚举最后一个位置上填了什么。
那么最后有
每项都求出来就是 的。
第二种使用于求单项。
考虑拉格朗日反演。
对于奇数大小的集合,最后再考虑填什么数,所以其 EGF 就是 。
对于偶数大小的集合,显然每个集合都有 种填法,所以就是 。
然后有
的复合逆容易求解,就是 。
剩下的问题是 well-known 的,于是这一部分是 的。
模型一
接下来考虑最本源的模型一。
一个 naive 的想法是数位 dp,记录位数和顶到上界的数的个数。
单次就是 的。
显然可以有更优的做法。
枚举一个公共的 lcp,然后从当前位填 的数中选出一个,剩下的全部任意填。
可以发现,最后用选出的这个数一定能凑出 。
于是就是要算
表示 剩余位组成的数。
稍微化简一下就可以变成幂和问题,于是就能做到单次 。
当 时:
令 。
求单项时,可以做到 。
求前 项时,使用分治NTT就能做到 。
当 时:
可能会需要一些分讨,但至少也有 级别的复杂度。
True Ending
现在看来,每个问题已经圆满解决了,也没有任何优化的空间了。
但……
事实果真如此吗?
对于大部分异或问题的解决,我们似乎还有更加直接更加粗暴的方法
——没错,就是FWT!
FWT的角度
引入二元 GF。
定义 上的卷积为普通卷积, 上的卷积为异或卷积。
对于模型三,转化成
模型二直接就是
模型一对 FWT 则不是特别友好,而且我们已经做到了足够优的复杂度,不予赘述。
先对模型二简单推一下式子
再做 IFWT,得到
其中 。
考虑 的计算:
仿照模型一的套路,枚举一个 lcp。
设 剩下位中有 个 ,当前是第 位,lcp 中 And 出了 个 。
于是就是求算
也就是
做一点观察:
当 时,上式变为 。
当 时,上式变为 。
也就是说,我们从低到高位,找到第一个不为 的位,剩下的系数只跟之前 And 出的 的个数的奇偶性有关。
也就是说 的取值只有 种。
枚举这个不为的位之后,对于 的求算也是 trivial 的。
对于单个 的计算:
显然可以用 ODE 计算,求前 项就是 的,求单项也可以整式递推 。
不过这里有个复合形式,尝试往拉格朗日反演的方向靠近。
先把 提出去,变成求 。
于是
对于前 项的求解,给 乘上一个 后就是简单的卷积。
对于单项的求解,事实上不会更优,因为瓶颈在于 的求解。
发现求 就是对一个高次少项式的多项式平移。
不妨规约成平移常数 的问题。
那么
对其转置,得到
也就是下降幂多项式的多点求值。
我们认为 和 同阶,于是就可以做到 。
至此,完结撒花!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现