1 条题解
-
0
题解
思路
先根据同一字符计数向量能形成的不同排列数判断博弈胜负,再把“多项式系数为奇数”转化为二进制位无进位分配,最后用子集卷积计数。
做法
设各字母出现次数为 ,相同计数向量共有
个不同排列。归纳分析游戏可得: 为奇数时所有字符串都是先手必胜; 为偶数时,恰好 为奇数的字符串是败态。
由二进制下的 Kummer 定理, 为奇数当且仅当 的二进制加法不产生进位。也就是说, 的每个置位必须分配给恰好一个字母。
子任务 1
枚举全部 个字符串,统计各字母次数并判断二进制无进位条件。
子任务 2
令 ,把 的置位编号。对一个位集合 ,令 为这些二进制位表示的整数,权值为 。
依次处理 个字母,枚举当前字母取得的子集,可用 的子集动态规划求出
$$\sum_{S_1\sqcup\cdots\sqcup S_k=U}\prod_i\frac1{v(S_i)!}.$$乘以 即为败态字符串数。
子任务 3
上述表达式是函数 的 次子集卷积在全集处的值。按集合大小分层做 Zeta 变换,把子集卷积变成每个掩码上的普通多项式乘法;对该多项式快速幂到 次,再做 Möbius 逆变换即可。
最终答案为 减去败态数;若 为奇数则直接输出 。
正确性
博弈归纳给出了败态与排列数奇偶性的等价关系。Kummer 定理保证多项式系数为奇数恰好对应所有置位无冲突分配。子集动态规划与分层子集卷积都逐一计入这些有序分配,并以 恢复每个计数向量对应的字符串数,因此计算出的败态数与定义一致。
复杂度
- 子任务 1:;
- 子任务 2:;
- 子任务 3:;
- 空间复杂度为 。
- 1
信息
- ID
- 1494
- 时间
- 3000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 0
- 上传者