集合幂级数
写在前面
-
大概就是看了一些题解总结了一下得出的东西
-
肯定有很多错误,欢迎指出
-
目前学习的不多,希望轻喷
问题引入
-
对于一个大小为
的异或为 的集合,有 种选择的方案使得选出两个集合的异或和为 -
对于每个元素的贡献都是
,那么其实我们就要求 FWT 意义下的 -
一个想法就是对于每个元素都正变换,然后点值乘起来,然后再逆变换,但是复杂度太高了
-
考虑 FWT 正变换的意义是
,那么就可以发现正变换后每个数只会是 或 -
那么我们考虑求出每一位有多少位是
,多少位是 -
我们可以考虑将每一位加起来然后用一元一次方程来解出每一位
的个数,剩下的个数就是 了 -
而
,所以我们将 正变换后,求出每一位 和 的个数,然后算出乘积,最后逆变换回来,但是就是
进阶问题
-
显然答案就是
FWT 变换后的每一项的系数 -
还是考虑按照上面的做法,但是这样每一位的数字就会有 8 种可能性,太麻烦了
-
考虑利用异或的自反性,我们将每一组的每个数字都异或上
,最终的结果异或上 就是原答案了 -
那么现在的三元组就是
,下面的 以新的三元组为标准 -
那么实际上就是求
-
那么现在的可能就只有 4 种了,考虑仍然像上面那样用方程来解
-
设
-
注意到我接下来所谈到的
都是关于 FWT 数组的某一项的相关数量 -
第一个方程:
-
其实可以发现这里的
和 是没有关系的,只和 有关系 -
我们让
取特殊值来设出接下来的 3 个方程 -
当
的时候,每一项的贡献只和 有关 -
第二个方程:
-
当
的时候,每一项的贡献只和 有关 -
第三个方程:
-
最后一个方程,我们考虑
同时做贡献,也就是令 的系数为 1 ,其余的为 0 -
对于每一位的系数实际上就是
-
第四个方程:
-
然后就解这四个方程就可以知道对于每一位所有值分别的个数了,然后还原成原本的值,再 IFWT 回去就得到了答案数组,输出答案的时候记得
问题模型
- 然而通过特殊的处理处理了上面的类似问题还不够,考虑这个问题的模型
求形如
FWT 变换后的每一项的系数,假设
- 最暴力的肯定就是
,瓶颈在于 ,考虑能不能像上面一样解方程
想法一
-
一共有
种取值,假设出现次数为 ,对于一位如果为 ,说明此处的实际取值为 -
我们此时理论上需要
个方程,第一种就是和为 ,所以还需要 -
仍然考虑取特殊值
-
我们考虑枚举每一个子集的贡献,去掉一个都不选的情况,刚好就会有
个方程出现 -
设取的子集的二进制表示为
,假设为集合 ,那么对于每一项的系数就是 -
那么考虑当前方程的每一个
的系数就是 -
方程设好后直接暴力解
-
那么理论复杂度就是
-
复杂度的瓶颈在于解方程的
上
想法二
-
当我们枚举一个子集
,特殊值取 的时候,在方程种 的系数就是 -
实际上这是 FWT 系数,现在我们考虑将每一位单独看,下面所讨论都是针对于每一位
-
我们考虑将数组
FWT 后,每一项 就是 ,可以发现这个东西就是关于集合 T 的方程,假设这个数组为 ,那么我们只要将 逆变换回去就是 数组了 -
对于一个子集关于一项方程的答案是很好求的,我们记录下每个子集关于每一项的答案
-
然后对于每一项逆变换回去就可以得到这一项的
了 -
理论复杂度就是
-
这里就不再是暴力的解方程,而是利用了一个很巧妙的性质
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探