qoj#6344 The Best Problem of 2021 题解
结合(模拟赛的)官解和这篇题解学习的,整理一下思路。
特判 \(B\) 线性相关的情况。
由于 \(0\) 对线性基没有影响,将题目中区间改为 \([0,X]\),最后答案除以 \(2\) 即可。
下文中的向量其实就是二进制数。
这部分是一个有用的特殊性质。
首先考虑 \(X=2^m-1,n=m\) 的情况,这相当于求 \([1,2^n-1]\) 中有多少个子集的线性基长为 \(n\)。
一个自然的想法是容斥,考虑每一组长为 \(i\) 的线性基 \(B\),它的张成空间 \(\mathrm{span}(B)\) 大小为 \(2^i\),有 \(2^{2^i}\) 个子集。这需要容斥解决两个问题:
- 如何计算容斥系数。
- \(\mathrm{span}(B)\) 不止有 \(B\) 一组基,也就是同一个 \(i\) 之间也要容斥。
对于第二个问题,一个解决方法是对于每个集合选出一组特殊的基。可以证明,如果线性基每个主元位上只有一个 \(1\),那么这组线性基就是唯一确定的,称这样的基为最简基。证明如下:
- 对于一个集合,线性基的主元位唯一:假设存在两组主元位不同的线性基 \(B_1,B_2\),如果它们最高主元位相同,那么可以分别删去这两个基向量,剩下的两组基张成空间仍然相同;如果它们最高主元位不同,显然不可能张成同一个空间。
- 对于一个集合,最简基唯一:假设 \(B_1\) 和 \(B_2\) 有一个主元位上基向量不同,考虑 \(B_1\) 中的这个基向量在 \(B_2\) 中如何表示,由于其余主元位均为 \(0\),不可能用到其他位上的基向量表示,也就是两个最高主元位上的基向量相同。
重新整理容斥。首先要求 \(f_n\) 表示线性基长为 \(n\) 的集合数量,先求出 \(g_i\) 表示对于每组长为 \(i\) 的最简基的张成空间的子集数,然后计算 \(coef_i\) 表示容斥系数,使得 \(f_n=\sum_{i=0}^ncoef_ig_i\)。
对于求出 \(g\),可以进行 dp。设 \(g_{i,j}\) 表示在 \([0,2^i-1]\) 中选出长为 \(j\) 的最简基的数量,那么有转移 \(g_{i,j}=g_{i-1,j}+g_{i-1,j-1}2^{i-j}\)。或者有另一种直接计算的方式,考虑在 \([0,2^i-1]\) 中选出长为 \(j\) 的基,那么选第 \(k\) 个(\(k=0,1,\dots,j-1\))的方法数是 \(2^{i-k}-1\),所以总方法数是 \(\prod_{k=i-j+1}^i(2^k-1)\)。那么一个长为 \(j\) 的最简基恰好对应一个大小为 \(2^j\) 的向量空间,对应的基的数量就相当于求 \([0,2^j-1]\) 中选出长为 \(j\) 的基的方法数,也就是 \(\prod_{k=1}^j(2^k-1)\),所以得到 \(g_{i,j}=\frac{\prod_{k=i-j+1}^i(2^k-1)}{\prod_{k=1}^j(2^k-1)}\)。
从更高的观点来看,设 \(\prod_{k=1}^i(2^k-1)\),那么 \(g_{i,j}=\frac{h_i}{h_jh_{i-j}}\) 。这个类似组合数的形式实际上就是 q-二项式系数,而上面的递推式就是 q-二项式系数的帕斯卡定理。
对于求出 \(coef\),仍然考虑 dp。每个线性基长度为 \(n\) 的集合只会被一组长度为 \(n\) 的最简基统计,所以 \(coef_n=1\)。对于 \(i< j\leq n\),设某个线性基长度为 \(i\) 的集合对应最简基 \(B\),那么这个集合会被一个长度为 \(j\) 的最简基 \(B^{\prime}\) 包含,当且仅当 \(B\subset B^{\prime}\),证明和上面证明最简基唯一类似。那么每个线性基长度为 \(i\) 的集合在容斥长度为 \(j\) 的集合时被计算的次数就是这样的 \(B^{\prime}\) 的数量。考虑计数 \(B^{\prime}\setminus B\),由最简基得 \(B^{\prime}\setminus B\) 在 \(B\) 中主元位上必须为 \(0\)。那么 \(B^{\prime}\setminus B\) 就相当于在剩下的 \(n-i\) 个位中选出长为 \(j-i\) 的最简基,方案数就是 \(g_{n-i,j-i}\)。故 \(coef\) 有递推式 \(coef_i=-\sum_{j=i+1}^ncoef_jg_{n-i,j-i}\)。
打表也可以发现,实际上 \(coef_i=(-1)^{n-i}2^{\binom{n-i}{2}}\)。这可以通过上面的递推式归纳,并使用 q-二项式定理证明。
据说这是 q-二项式反演,但是我不懂。
考虑没有这个性质的情况。
先将题目中的线性基化为最简基 \(B\)。
现在的 \([0,X]\) 中有很多没有用的数,考虑转化成类似特殊性质的问题。设 \([1,X]\) 中有 \(rank(X)\) 个数可以被线性基表示,那么问题等价于求 \([0,rank(X)]\) 中有多少子集的线性基长为 \(n\)(这是因为所有 \(\mathrm{span}(B)\) 中的向量都可以同构到基的线性组合,从而同构于 \([0,2^n-1]\) 中的数)。
求 \(rank(X)\) 可以直接贪心,相当于求出 \(B\) 的字典序最大的线性组合使得异或结果不超过 \(X\)。下面令 \(X=rank(X)\)。如果 \(X<2^n\),那么答案为 \(0\)。
考虑像前面一样对所有长度 \(\leq n\) 的最简基容斥。\(coef\) 显然不变,只需要求出现在的 \(g\)。对于一组最简基 \(B\),设 \(cnt(B)=|\mathrm{span}(B)\cap[0,X]|\) 也就是 \([0,X]\) 中能被线性组合出的数量,那么 \(g_i\) 就是所有长度为 \(i\) 的最简基 \(B\) 的 \(2^{cnt(B)}\) 之和。
其实这个 \(cnt\) 和 \(rank\) 几乎是一样的,但上面那个求 \(rank\) 的方式需要考虑每个基的整体情况,不好 dp,考虑另一种计算 \(cnt(B)\) 的方式:
- 记录变量 \(Y\) 初始为 \(0\),\(C\) 初始为 \(0\)。
- 从高到低考虑每一位:
- 如果这一位 \(X,Y\) 相同则跳过。
- 否则,如果 \(B\) 中这一位有基向量(此时必然 \(X\) 这一位是 \(1\),\(Y\) 是 \(0\)),那么 \(Y\) 异或上这一向量,并且设这一位之后(不包含)还有 \(K\) 个基向量,那么 \(C\) 加上 \(2^K\)。
- 如果 \(B\) 中这一位没有基向量且 \(X\) 是 \(1\),\(Y\) 是 \(0\),那么后面的基随意组合,得到 \(cnt(B)=C+2^K\)。
- 如果 \(B\) 中这一位没有基向量且 \(X\) 是 \(0\),\(Y\) 是 \(1\),那么后面的基全都不能选,得到 \(cnt(B)=C\)。
- 如果考虑完所有基,说明 \(X\in\mathrm{span}(B)\),得到 \(cnt(B)=C+1\)。
对这个过程进行 dp。考虑到从高到低的过程中,异或一个主元位上的基向量对后面的位有影响,我们从低位往高位 dp(其实从高到低应该也行),注意到上面的计算过程中有中途结束的情况,从此处分段 dp。设 \(f_{i,j}\) 表示考虑完最低 \(i\) 位(\(0\sim i-1\) 位),已经确定了 \(j\) 个基向量,而且这后面都是随意确定(就是说后 \(i\) 位都是被上面 \(cnt\) 的计算过程中 2.3,2.4 情况跳过的)的所有 \(2^{cnt}\) 的和,\(g_{i,j}\) 表示考虑完最低 \(i\) 位,确定了 \(j\) 个基向量,并且 \(i\sim n-1\) 位上 \(X\) 都和 \(Y\) 相同的所有 \(2^{cnt}\) 的和。
为了方便计算,钦定最高位(\(n-1\) 位)上一定有基向量,原因会在转移中看到。
dp 初值为 \(f_{0,0}=1,g_{0,0}=2\),这对应在考虑完所有基后 \(X=Y\) 的情况,\(cnt\) 要加 \(1\)。
考虑 \(f_{i,j},g_{i,j}\) 会转移到那些值,需要对于第 \(i\) 位 \(X,Y\) 的情况分类讨论一下:
-
如果 \(X\) 第 \(i\) 位为 \(1\):
- 如果这一位上有主元,那么这个基向量有 \(2^{i-j}\) 种可能,对于 \(g\) 的情况,这一位必然会异或上这个基向量(因为 \(Y\) 这位肯定是 \(0\)),那么 \(cnt\) 增加 \(2^j\),即:\(f_{i+1,j+1}+=f_{i,j}\times 2^{i-j},g_{i+1,j+1}+=g_{i,j}\times 2^{i-j}\times 2^{2^j}\)。在 \(i=n-1\) 时,这是唯一的转移。
- 如果这一位没有主元,那么就有 \(Y\) 这一位为 \(0/1\) 两种情况。这是由更高位的基向量确定的,不在我们的 dp 状态里面。但是注意到,如果 \(Y\) 在更高位异或过(至少)一个基向量,那么它在这一位的取值是任意的,也就是这一位 \(Y\) 为 \(0/1\) 的可能方案一定是一一对应的,并且方案得到的 \(C\)(只考虑到第 \(i+1\) 位)也是一一对应的。这就是一开始钦定最高位有基向量的原因,我们可以在这一位“预判”最高位的基向量这一位取的是 \(0\) 还是 \(1\),转移时直接带上 \(\frac{1}{2}\) 的系数(也可以从概率的角度理解)。
- 如果这一位 \(Y\) 为 \(1\),那么 \(f_{i+1,j}+=f_{i,j}\times \frac{1}{2},g_{i+1,j}+=g_{i,j}\times \frac{1}{2}\)。
- 如果这一位 \(Y\) 为 \(0\),那么 \(g_{i,j}\) 不可能往前转移,\(f\) 可能转移到 \(j\)(也就是这一位出现了 2.3 的情况),这会让 \(cnt\) 加上 \(2^j\),有 \(f_{i+1,j}+=f_{i,j}\times \frac{1}{2},g_{i+1,j}+=f_{i,j}\times \frac{1}{2}\times 2^{2^j}\)。
-
如果 \(X\) 第 \(i\) 位为 \(0\),和上面大体类似,但是可以发现此时 \(cnt\) 不可能增加:
- 如果这一位上有主元,对于 \(g\) 的情况,这一位不会对 \(cnt\) 有贡献,即:\(f_{i+1,j+1}+=f_{i,j}\times 2^{i-j},g_{i+1,j+1}+=g_{i,j}\times 2^{i-j}\)。
- 如果这一位没有主元,也有 \(Y\) 这一位为 \(0/1\) 两种情况。。
- 如果这一位 \(Y\) 为 \(0\),那么同上 \(f_{i+1,j}+=f_{i,j}\times \frac{1}{2},g_{i+1,j}+=g_{i,j}\times \frac{1}{2}\)。
- 如果这一位 \(Y\) 为 \(1\),那么 \(g_{i,j}\) 不可能往前转移,\(f\) 可能转移到 \(j\)(也就是这一位出现了 2.4 的情况),有 \(f_{i+1,j}+=f_{i,j}\times \frac{1}{2},g_{i+1,j}+=f_{i,j}\times \frac{1}{2}\)。
最后这一部分对 \(g_i\)(这个是我们一开始希望求的 \(g_i\),表示所有长度为 \(i\) 的最简基的 \(2^{cnt}\) 之和)的贡献即为 \(g_{n,i}\)。
再考虑最高位(\(n-1\) 位)没有基向量的那些最简基,这样的最简基有 \(g_{n-1,i}\) 种(注意这个 \(g\) 是特殊性质里面的 \(g\),表示在 \([0,2^{n-1}-1]\) 中有多少组长度为 \(i\) 的最简基,不是 dp 求的 \(g\)),每种的 \(cnt\) 都是 \(2^i\),总贡献为 \(g_{n-1,i}\times 2^{2^i}\)。
一开始消元化简 \(B\) 的复杂度用 bitset 做到 \(O(\frac{n^3}{\omega})\),后面所有计数部分复杂度 \(O(n^2)\)。
总复杂度为 \(O(\frac{n^3}{\omega}+n^2)\)。

浙公网安备 33010602011771号