CF1603F October 18 2017
q-Binomial 就像 QB,你知道没有它会更糟,但就是不想它存在。
多组询问,给定 \(n, k, x\),求有多少长度为 \(n\) 的序列 \(a\) 满足 \(a_i\in[0, 2^k)\cap\mathbb Z\),且其中不存在非空子序列异或和为 \(x\)。
\(1\le n\le 10^9, 0\le k\le 10^7, \sum k\le 5\times 10^7, 0\le x < 2^{\min\{k, 20\}}\)
假如 \(x = 0\),答案是大小为 \(n\) 且秩为 \(n\) 的序列个数,注意到 \(n \le k\) 必须成立(否则答案为 \(0\)),则容易在 \(\Theta(k)\) 时间内计算。以下假设 \(x \ne 0\)。
显然地,对于原序列的任何一个非空子序列,它的线性基加入 \(x\) 以后秩必须增加 \(1\)。考虑依次加入序列中的数,记 \(f_{i, j}\) 表示 \(i\) 个元素的序列,秩为 \(j\) 且合法的方案数。加入一个数时,要么秩不变要么加 \(1\)。如果秩不变,则必须选择先前线性基可以表示出的 \(2^j\) 个数中的某一个;如果秩加 \(1\),那么不能选择任何可以被先前线性基加入 \(x\) 后表示出的数。注意到 \(x\) 不能被先前的线性基表出,所以这样的方案数就是 \(2^k - 2^{j+1}\)。转移方程是 \(f_{i,j} = 2^{j}f_{i-1,j} + (2^{k} - 2^{j})f_{i-1,j-1}\),且 \(f_{0,0} = 1\)。最后要求的答案是 \(\sum\limits_{j=0}^{\min\{n,k-1\}}f_{n,j}\)。我们可以枚举 \(j\),这样可以预处理出所有第二种转移的系数乘积,然后把这个转移系数变成 \(1\),随后 \(f_{i,j}\) 就变成了 \({n\brack j}_2\),套用 q-Binomial 的公式 \(\frac{[n]_2!}{[j]_2![n-j]_2!}\),递推出 \([n]_2! = [n-1]_2!\cdot(2^n-1)\) 即可。