P3214 [HNOI2011] 卡农
题面
给定 \(n, m, k\),你需要求满足以下条件的长度为 \(n\) 的序列 \(a\) 的数量:
- \(0 < a_1 < a_2 < a_3 < · · · < a_n < 2^m\)
- \(\oplus_{i=1}^n a_i = 0\),其中 \(\oplus\) 表示按位异或
对 \(10^8+7\) 取模。
数据范围 :\(n,m\le 10^6\) 。
题解
做法一
我们先不考虑异或为 \(0\) ,那么答案就是 \(\binom{2^m-1}{n}\) 。
然后注意到我们可以用最后一个为前 \(n-1\) 个数的异或值来达到 \(n\) 个数异或值为 \(0\) 。
但是会有两种情况不合法:
- 前 \(n-1\) 个数的异或值刚好是 \(0\),对应的数量就是 \(f_{n-1}\)
- 前 \(n-2\) 个数的异或值刚好是 \(0\),这样无论 \(n-1\) 个数选了什么,第 \(n\) 个数都没法满足(重复了),对应的数量就是 \((2^m-1-(n-2))f_{n-2}\) 。
所以 :
做法二
考虑生成函数,可以由题意得到,答案就是:
考虑先用 \(fwt\) 转成点值形式,根据理论,异或的矩阵 \(C_{S,T}=(-1)^{|S\cap T|}\)。
所以转换之后的就是 \(fwt[F(x)]_{T}=(1-t)^{k_1}(1+t)^{2^m-1-k_1}\) ,现在我们要对每一个 \(T\) 求 \(k_1\) 的个数。
因为 \(k_1=2^{m-|T|}\sum_{i}\binom{|T|}{2i+1}\) 。
注意到如果 \(|T|\neq 0\) ,那么 \(\sum_{i}\binom{|T|}{2i+1}=2^{|T|-1}\) ,所以 \(k_1=2^{m-1}\) 。
而 \(|T|=0\) 时 \(k_1=0\) 。
所以:
现在考虑再换回来,同样根据理论,异或的逆矩阵是\(C'_{S,T}=\frac{1}{|U|}(-1)^{|S\cap T|}\) ,所以:
而 \([t^n](1+t)^{2^m-1}=\binom{2^m-1}{n},[t^n](1-t)(1-t^2)^{2^{m-1}-1}=(-1)^{\lceil m/2\rceil}\binom{2^{m-1}-1}{\lfloor m/2\rfloor}\) 。
所以剩下的问题就是求两个组合数了。
启发
- 一个问题如果有多个限制,先搞掉后面难以去除的限制,就比如说这里的不相同。
- 多元生成函数其实和单元的类似。
- 对集合幂级数做变换一定要注意到矩阵很单一!!可以转换成求个数的问题!
- 异或的逆矩阵要注意!