0. 「OurOJ #46942」/「51nod #1824」染色游戏
首先,显然有
这是一个卷积的形式,但是我们需要求出卷积结果在 \(\bmod 2\) 意义下的值。从这个 \(\binom{t}{i}\) 入手,发现 \(\binom{t}{i}=1\pmod 2\Leftrightarrow i\in t\)(\(i\) 在二进制表示下是 \(t\) 的子集)。也就是说,我们可以直接用子集卷积替代加法卷积,\(\mathcal O(n\log^2n)\) 求出卷积结果。
1. 「CF 662C」Binary Table
Link & Submission.
注意到当行上(列上)的操作全部确定后,列上(行上)每种操作是否进行可以贪心决策。这提示我们枚举一部分,算另一部分。因为有 \(n\ll m\),我们来暴力枚举行上的 \(2^n\) 种操作是否进行,并在每一列分别算出最小 \(1\) 的数量。但这个怎么优化呢?
难以转化的地方在于“算出最小 \(1\) 的数量”,涉及到取 \(\min\),我们干脆直接把表打出来:令 \([x^S]F(x)\) 表示某一列为 \(S\) 时,其仅通过列操作能得到最小 \(1\) 的数量。在这个比较构造性的转化之后,接下来的工作就很简单了——令 \([x^S]G(x)\) 为原表格中长相为 \(S\) 的列的出现次数,那么
其中 \(\times^{\oplus}\) 表示异或卷积。可见 \([x^T]R(x)\) 就是行操作为 \(T\) 时的答案。复杂度 \(\mathcal O(nm+n2^n)\)。
2. 「WC 2018」「洛谷 P4221」州区划分
Link & Submission.
一大坨式子和离奇限制砸脸——哦,原来是状压题。
一个连通块合法的条件为:该连通块的诱导子图不存在欧拉回路,即不连通或者存在奇度点。
状压连通性等一系列处理可以快速求出每个连通块是否合法。记 \(f(S)\) 表示划分好 \(S\) 集合内的点的贡献和,那么
又是子集卷积的形式。注意显然有 \(|T|>1\),所以当引入子集卷积的状态形式 \(f(|S|,S)\) 时,转移仍然没有环。直接 \(\mathcal O(n^22^n)\) 算出来即可。
3. 「THUPC 2019」「洛谷 P5406」找树
Link & Submission.
众所周知位独立的运算,特别是这种有交换律的运算,都能用魔改 FWT 支持其卷积。边 \((u,v)\) 的边权 \(v\) 做正变换得到向量 \(\boldsymbol v\),此时一棵生成树的点权定义为边上向量的点积。点积可以分开算,所以算 \(w\) 次矩阵树可以求到记录所有权值的生成树数量的序列 \(R\) 做正变换后的结果,把 \(R\) 逆变换一下,找到最高非 \(0\) 位即可。
生成树数量很大?随便那一个大素数取模。复杂度是 \(\mathcal O(wn^3)\),但你看这是洛谷 / LOJ 还开了 \(4\text s\) 就放心大胆写了叭。
4. 「JOI 2018 Final」「LOJ #2351」毒蛇越狱
Link & Submission.
一堆堆 \(10^6\) 让人不禁去想单 \(\log\),没想到正解甚至不是 polylog。
自然,我们希望找到某种“前缀和”来加速查询过程,继而想到本质上为高维前缀和的 and 变换和 or 变换。不妨记原序列为 \(f\),and 变换得到序列 \(g\),or 变换得到序列 \(h\)。
但,例如直接用 \(g\) 来查询,问题很大——如果某个 bit 限制为 \(1\),查询结果没有问题;但如果某个 bit 限制为 \(0\),根据 and 卷积的规则,我们会将一些这一 bit 为 \(1\) 的数加入答案。补救一下?我们对 \(0\) bit 的位置做容斥,即枚举哪些 \(0-\)bit 变成了 \(1\),我们确实就能得到答案。
然后就是比较 constructive 的一点:用 \(g\) 查询,容斥 \(0-\)bit;用 \(h\) 查询,容斥 \(1-\)bit;用 \(f\) 查询,枚举 \(?-\)bit,复杂度平衡,得到 \(\mathcal O(L2^L+Q2^{L/3})\) 的算法。
5. 「OurOJ Contest #2562」多项式佛跳墙
现推了一遍,直接放草稿了,牛迭之类的地方跳步比较严重,估计会方便记忆(?)带讲解的版本可以看 这里。板子从零开始不断累计,我交“多项式除法”的那发代码应该算是比较完整的全家桶。
可以发现,最难(步骤最长)的地方是二次剩余。(
鬼故事:全部 \(\mathcal O(n\log n)\)。
6. 「OurOJ #5430」yww 与连通块计数
不考虑 \(\gcd\) 中的以及 \(\operatorname{lcm}\) 以外的因子,设数 \(a\) 除 \(\gcd\) 以外的因子构成集合 \(S_a\),那么连通块合法,等价于 \(S\) 之交为 \(\varnothing\),\(S\) 之并为全集。
也就是说,对于每个元素 \(p\),块内都有一个 \(p\in S_1\) 也有一个 \(p\notin S_2\)。
也就是说,存在一对邻接的 \(u,v\),\([p\in S_{a(u)}]\neq[p\in S_{a(v)}]\)。
也就是说,令边 \((u,v)\) 的权 \(w(u,v)=S_{a(u)}\oplus S_{a(v)}\),则连通块合法等价于 \(w\) 之并为全集。
手动模拟 or-卷积,可以做到 \(\mathcal O(n2^m)\),其中 \(m=15\),为 \(50\) 以内素数个数。
7. 「OurOJ #47016」排列问题
灵活转换“计数视角”,“描述过程”而非“拼凑答案”。
令 \(F_i(x)\) 表示把颜色为 \(i\) 的球放入若干不同盒子的 EGF,即
那么,\(G(x)=\prod_i F_i(x)\) 即把所有盒子按颜色区分,放在一起的 EGF。相同盒子内的球必然贡献同色对,不同盒子间可能贡献同色对。所以 \(G(x)\) 亦可以转化为“至少有若干同色对”的 EGF。合并石子 \(\mathcal O(m\log^2m)\) 求出 \(G(x)\),二项式反演卷出答案的 GF 即可。
8. 「JLOI 2016」「洛谷 P3270」成绩比较
Link & Submission.
令 \(\textit{ans}_K\) 表示答案。先钦定 \(K\) 个被碾压的人的标号,然后考虑每种课程,枚举 B 神的得分组合一下,有
最后一项自然数幂和可以随意拉插算出来。不过交上去得到了 \(90\) 分的好成绩,猛然发现,被碾压的人一定被碾压,但根据式子,没被碾压的人实际上也可能被碾压。所以还需要对 \(\textit{ans}\) 二项式反演一下。注意和式 \(\sum_{k=0}^{R_i-1}\cdots\) 与 \(K\) 无关,可以先预处理出来。
如果实现得优美,可以做到 \(\mathcal O(MN^2)\)。