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}\)

所以 :

\[f_n=\frac{1}{n}\left(\binom{2^m-1}n-f_{n-1}-(2^m-1-(n-2))f_{n-2}\right) \]

做法二

考虑生成函数,可以由题意得到,答案就是:

\[[x^{\varnothing}t^n]\prod_{S\neq \varnothing}(1+x^St) \]

考虑先用 \(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\)

所以:

\[fwt[F(x)]_T= \begin{cases} (1+t)^{2^m-1}&T=\varnothing\\ (1-t)^{2^{m-1}}(1+t)^{2^{m-1}-1}=(1-t)(1-t^2)^{2^{m-1}-1}&T\neq\varnothing \end{cases} \]

现在考虑再换回来,同样根据理论,异或的逆矩阵是\(C'_{S,T}=\frac{1}{|U|}(-1)^{|S\cap T|}\) ,所以:

\[[x^{\varnothing}]F(x)=\frac{1}{2^m}\left((1+t)^{2^m-1}+(2^m-1)(1-t)(1-t^2)^{2^{m-1}-1}\right) \]

\([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}\)

所以剩下的问题就是求两个组合数了。

启发

  • 一个问题如果有多个限制,先搞掉后面难以去除的限制,就比如说这里的不相同。
  • 多元生成函数其实和单元的类似。
  • 对集合幂级数做变换一定要注意到矩阵很单一!!可以转换成求个数的问题!
  • 异或的逆矩阵要注意!
posted @ 2022-06-30 19:27  qwq_123  阅读(27)  评论(0编辑  收藏  举报