Petrozavodsk Programming Camp, Winter 2022 部分题解
Day 1: Kyoto Contest 2
K. King’s Palace
折半枚举。分成长度为\(k\)和\(n-k\)的两部分。
先预处理,\(3^k\)枚举左边的每种染色方案。对每一个合法方案都算一个二进制mask1,mask1表示该染色方案对右边的颜色限制,一共\(2^{3(n-k)}\)种。最后可以统计出每一个mask1对应多少种左边的染色方案。
然后\(3^{(n-k)}\)枚举右边的染色方案,对每个方案也算一个二进制mask2,mask2表示染色方案中哪些颜色被选了。只需要统计有多少mask1满足mask2&mask1=0即可。在mask1上进行子集DP预处理后,对于每一个mask2,可实现\(O(1)\)查询答案。
总复杂度 \(O(3(n-k)2^{3(n-k)}+3^k+3^{(n-k)})\)。取\(k=15\)即可通过。
Day2: KAIST Contest
C. AND PLUS OR
若仅有2个二进制位不同的\((i,j)\)不存在解,则全局无解。
Proof:数学归纳法
假设有\(2,3,\dots,k-1\)个二进制位不同的\((i,j)\)全部无解。\(\forall\)有\(k\)个二进制位不同的\(i,j\),记\(i=(A,C),j=(C,B)\),\(C\)表示\(i\&j\)的二进制位,\(A\)表示\(i\)独有的,\(B\)表示\(j\)独有的。\(A,B\neq\emptyset,a\in A\)。
由假设有:
两式相加得:
即\((i,j)\)也不是解。
End
依据结论\(O(n^22^n)\)枚举即可。
Day5: Yandex Cup 2022
G. Mismatch
先考虑如何求总方案数。对\(a_i\)做桶\(t_i\)。不难发现,答案即为多项式\((x^{t_i}+x^{2^{19}-1})\)的与卷积的\(0\)次项系数。由于有\(n\)个多项式,不能直接进行FWT变换。分析\((x^{t_i}+x^{2^{19}-1})\)的FWT变换,将两非零项分开考虑,\(x^{2^{19}-1}\)会对每一位产生\(1\)的贡献;\(x^{t_i}\)会对部分位产生\(1\)的贡献。因此,FWT变换后,应当是若干\(1\)和\(2\)组成的序列。\(n\)个FWT变换后的序列向乘,得到的最终序列中每一位都应为\(2\)的幂次。我们将\(n\)个\(x^{t_i}\)项合并在一起进行FWT变换,即对\(\sum{x^{t_i}}\)进行FWT变换,得到的序列记为\(S\)。序列\(\{2^{S_i}\}\)就是所有多项式FWT变换后的结果的乘积,对其进行FWT逆变换,答案即为第\(0\)项。
由上可见,总方案数是由若干\(2\)的幂次加减得到的。分析FWT的本质原理,可发现,对于所有\(k\)的答案,就是将总方案数中每一个\(2\)的幂次更换为组合数向量,再求向量和。直接用向量进行FWT逆变换的复杂度会炸,因此,我们考虑\(S\)中所有项对FWT逆变换后的第\(0\)项的贡献。手模可以发现,贡献系数序列\(A\)为:初始\(A=\{1\}\),每次令\(A=\{A,-A\}\),不断迭代,直到长度等于\(S\)。\(A\)可由线性DP求得。
把对所有\(k\)的答案写成生成函数形式:
对\(S_i\)做桶\(C_i\),并进一步化简可得:
我们需要对所有\(j\)求\(x^j\)的系数,因此交换求和顺序:
对于所有\(j\),\(\sum_{i=j}^n\frac{C_i i!}{(i-j)!}\),用NTT减法卷积求出即可。

浙公网安备 33010602011771号