CF Round 635 Div.1 Chiori and Doll Picking (Hard Version)
CF Round #635 Div.1 Chiori and Doll Picking (hard version)
考虑对于$a_i$建立线性基$d$,并且通过高斯消元重整,使得$d$中 每一个元素的最高位 仅自己包含
不妨设$k=|d|$,一个基底的生成集合为$S(d)$,设$A=S(d)$,预处理部分复杂度为$O(nm+k^2)$
根据线性基的基本性质,我们知道任何一个$x\in S(d)$有$2^{n-k}$种生成方法
因此我们只需要计算线性基元素异或的答案即可,这样我们将问题规模降低到了$k$
暴力1
对于$k\leq 27$,暴力枚举每个元素是否选择,可以通过预处理让复杂度降至$O(2^k)$
暴力2
$m\leq 35,k>27$时
由于线性基包含$k$个关键01位,$m-k$个非关键01位
通过高斯消元可以使得基的每一位仅包含一个关键01位
令$dp_{S,i}$表示选择了$i$个基,非关键01位异或和为$S$的方案数
复杂度为$O(2^{m-k}m^2)$
对称暴力
由于$m\leq 53$,而我们能够暴力解决$k\leq 27$,则可以考虑剩下的$m-k$个位,想办法在$O(2^{m-k})$时间内求解
考虑计算个数为$c$的方案数,我们用一个卷积形式来描述,令$\displaystyle F_c(x)=\sum_{|T|=c}x^{T}$
则容易发现 $ans_c=x^{\empty}$,其中$\bigoplus$表示 异或 (集合对称差) 卷积
显然我们需要$\text{FWT}$来计算这个东西,也就是计算
$[x^{\empty}]\text{FWT}(\text{FWT}(A)\cdot \text{FWT}(F_c))$
先考虑比较复杂的$G=\text{FWT}(A)$的计算
下面你需要良好掌握$\text{FWT}$,参考
1: $G(x)$中每一非零项系数为$2^k$
考虑线性基$A$的元素是封闭的,则有$A\bigoplus A=A\cdot |A|$
即$G\cdot G=G\cdot 2^k$,解方程得到$[x^S]G\in\{0,2^k\}$
2:$[x^S]G(x)=2^k\Longleftrightarrow \forall T,|S\cap T|\equiv 0\pmod 2$
由$\text{FWT}$式子
$[x^S]G(x)=\sum (-1)^{|S\cap T|} [x^T]A(x)$
而$A(x)$由$2^k$个1构成,故得结论
确定非零项
由恒等式$|X\cap S|+|Y\cap S|\equiv|(X\oplus Y)\cap S|\pmod 2$,得到简化
1.若$X,Y$对于$S$合法,则$X\oplus Y$同样合法,只需要考虑线性基$d$中元素对于$S$的限制
2.假设已知$S,T$非零,则$S\oplus T$非零,因此可以考虑用一个线性基$d’$来描述合法元素
确定$|d’|$大小
则$2^kS(d’)=G$,$\text{IFWT}(2^k\cdot S(d’))=A$
带入两边$x^{\empty}$项的值,容易得到$|S(d’)|=2^{m-k}$,故$|d’|=m-k$
$|d’|=m-k$是接近前面猜想的一大跳跃
构造$d’$?
考虑用0/1矩阵形式描述线性基$d$
将$d$中的元素中的最高位移动到主对角线上最高的$k$个位置,此时每一行一定是一个主对角线元素后面跟上一些位置$\ge k+1$的元素
此时$d’$的构造即:主对角线取反,其余位置为转置
$\color{blue} 1$ | 0 | 0 | $\color{blue} 1$ | 0 |
0 | $\color{blue} 1$ | 0 | 0 | $\color{blue} 1$ |
0 | 0 | $\color{blue} 1$ | $\color{blue} 1$ | 0 |
$\color{red}1$ | 0 | $\color{red}1$ | $\color{red}1$ | 0 |
0 | $\color{red}1$ | 0 | $\color{red}1$ | $\color{red}1$ |
Proof:
显然这样构造出的$d’$元素最低位独立,因此不线性相关,只需要证明满足限制即可
首先$d_i$与$d’_j$在主对角线上无交,有交部分一定是一个主对角线元素与一个非主对角线元素交
若$d_{i}$与$d’_j$在$d_{i,j},d’_{j,j}$有交,则在其关于主对角线对称的位置$d_{i,i},d’_{i,j}$处同样有交
因此交都是成对出现的
由此我们可以在$2^{m-k}$时间内通过暴力枚举得到$G$中每个非零项
下面考虑$\text{FWT}(F^c)$的贡献的部分实际极其简单
可以根据$G$中每一项$x^S$的$|S|$确定$\text{FWT}(F^c)$
$[x^S]\text{FWT}(F^c)=\sum_{|T|=c}(-1)^{|S\cup T|}$
对于$G$中不同的$|S|$分类,对于$|T|=c$,枚举$|S\cup T|$,添加组合数系数即可计算贡献
注意最后求出的答案$[x^{\empty}]$为对应项相乘之后求和除去$\text{IFWT}$的$2^k$
复杂度为$O(2^{m-k}+m^3+nm)$
1 | const int N=210,P=998244353; |