2026.2
2026.2
考虑怎么样的状态是公平的。具体来说,公平的状态一定是最终全部移除了,否则后手交换后赢了。
考虑给每个硬币赋值,使得两人权值和相等是合法的充要条件。
给出赋值方法,证明方式考虑超现实数。对于某一堆,底部连续属于同一个人的权值是 \(1\) ,其余权值都是前一个的 \(\frac{1}{2}\) 。
在 DP 的时候,每一堆硬币都在最低位加入。考虑数位 DP,从低位到高位考虑最终权值和的每一位,记 \(f_{i,j,k,l}\) 表示考虑了第 \(i\) 位,已经加入 \(j\) 堆,当前差值为 \(k\times 2^{m-2}+l\times 2^i\)。转移考虑给加入的当前位的硬币定符号,然后考虑加入 \(CCC\cdots N\) 或者 \(NNN\cdots C\) 。这三部分,考虑分步转移,复杂度是 \(O(n)\) 的。
由于 \(k\in[-mn,mn],l\in[-n,n]\) ,状态数是 \(O(n^3 m^2)\)的。
复杂度 \(O(n^4m^2)\)。
求点数为 \(n\) 的无向图中最小点覆盖为 \(k\) 的个数模 \(2\) 。
可以转最大独立集,为 \(n-m\) 个,这样可以预处理所有 \(n,m\) 。
设 \(N(x)\) 表示 \(x\) 的邻域。若 \(N(2)/1\ne N(1)/2\) ,即点 \(1\) 和 \(2\) 连向外部的点集不一样,那么交换 \(1\) 和 \(2\) 这两个点会得到一个新图,且这两个图的答案一样,所以这种情况一定答案是偶数,不考虑。
按照 \(1\) 和 \(2\) 之间有没有连边分类。
若 \(1\) 和 \(2\) 之间有连边,这两个点中一定有一个不能选,所以不妨删去点 \(1\) 。
若 \(1\) 和 \(2\) 之间没有连边,因为这两个点要么都选,要么都不选,因此可以合并为一个点。
这样两个点可以变成一个点,给每一个点一个权重表示这个点由多少点合并而来,初值是 \(1\)。继续处理 \((3,4),(5,6)\) ,每次合并权值相同,邻域相同的点。最终有若干个权重为 \(2\) 的幂次的点,假设从小到大为 \(2^{a_1},\cdots,2^{a_l}\),记 \(m=\sum 2^{a_i}\)。此时肯定有 \(a_i\) 互不相同,且每个点内部代表的点之间没有连边。
记 \(f(n,m)\) 表示 \(n\) 个点变成二进制方案为 \(m\) 的方案数,\(g(n,m)\) 表示点数为 \(n\) 最大独立集为 \(m\) 的图的个数。一是考虑 \(f(n,m)\) 怎么求,二是考虑 \(f(n,m)\) 会贡献到哪些 \(g(n,k)\) ,先看后者。
现在已知 \(m\) 二进制状态,对于每个 \(k\) ,确定在任意连边,有多少最大独立集是 \(k\) 。
那么 \(k\) 的每个二进制位一定是 \(a_i\) 里的。
由于每个点权重是 \(2\) 的幂次,直接贪心求最大独立集是对的。
设 \(x\) 表示最大独立集中最大的没有被选择的点。
若 \(x=0\) ,即所有的点被选中,当且仅当没有边合法,即 \(k=m\) 。
若 \(x=a_1\) ,那么比 \(a_1\) 大的点全部选中,此时只有 \(a_1\) 可以向外连边,由于不能不连,方案数为 \(2^{l-1}-1\) ,是奇数。
若 \(x>a_1\) ,这时候,在 \(x\) 和 \(a_1\) 之间连边,不会影响最大独立集的值,所以答案是偶数,可以直接不考虑。
所以 \(f(n,m)\) 可以贡献 \(g(n,m)\) 和 \(g(n,m-\operatorname{lowbit}(m))\) 。
考虑怎么求 \(f(n,m)\) 。考虑二进制下加入一个数会怎么转移。如果加入权重为 \(1\) 的点,如果 \(m\) 里面有权重为 \(1\) 的点,可以选择合并或者删掉。如果继续合并,就看有没有权重是 \(2\) 的点,一直做下去,发现就是可能合并到不能合并了,或者是合并的途中删掉了这个点。
记 \(x=\operatorname{lowbit}(m)\) ,考虑这个权重为 \(x\) 的点上一步怎么来的。
如果是一直合并,有 \(f(n,m)\gets f(n-1,m-1)\)。
如果加入了一个点,合并到一半就被删除了,那么上一步的 \(m\) 一定包含了后面的位,有 \(f(n,m)\gets f(n-1,m+x-1)\)。
于是用 bitset 维护 \(f,g\) 的转移即可,复杂度 \(O(n^2)\) 。

浙公网安备 33010602011771号