AGC052C 笔记
实在是一个 NB 题
题意
给定整数 \(N, P\),求出满足条件的序列 \(A\) 的数量:
- \(1 \le A_i < P\);
- 存在 \(A_1, \ldots, A_N\) 的排列 \(A'_1, \ldots, A'_N\),使得对于 \(1 \le k \le N\),都有 \(\sum_{i = 1}^k A'_i \not \equiv 0 \pmod P\)。
\(N \le 5000, P \le 10^8\),答案对 \(998244353\) 取模。
思路
手玩样例之后,发现在不合法的序列中 \(\sum_i A_i \equiv 0 \pmod p\) 比较特殊,需要特判掉。
接着考虑找到序列合法的充要条件,再次手玩之后发现众数是很重要的,把重排序列看成往集合 \(S\) 中一个一个加数,在无解的时候经常会遇到最后只有众数能选,其它数都选过了的情况。
于是假设众数为 \(1\),为什么呢?因为 \(1\) 有很好的性质:假如最后只有 \(1\) 可以选择,那么和一定是连续地变大,这时判是否是 \(P\) 的倍数较为容易。当众数不是 \(1\) 的时候怎么办呢?有一个精美的想法,就是把所有数全部乘上众数的逆元,这并不改变合法性的判定,因为 \(0\) 乘上逆元等于 \(0\)。
考虑一个构造,假设当前为 \(sum\),众数为 \(x\),则:
- 如果 \(sum + x \not \equiv 0 \pmod P\),则加入 \(x\);
- 否则找到另一个数 \(y\),在加入 \(y\) 后继续加入 \(x\)。
这个构造到最后会形如(假设加入的 \(y\) 分别是 \(B_1, B_2, \ldots, B_M\)):
只要没有剩余的 \(1\),就一定可以构造出来。而如果构造不出来,即有剩余的 \(1\),就一定无解,因为没有任何其它数能帮助它跨过 \(P\) 的倍数了。
于是就找到了序列合法的充分必要条件:
考虑求解答案,设 \(a_i\) 表示长度为 \(i\) 且和是 \(P\) 倍数的序列数量,有递推式:\(a_n = (P - 1)^{n - 1} - a_{n - 1}\),这是因为前 \(n - 1\) 个元素的和 \(S\) 只要不是 \(P\) 的倍数,那第 \(n\) 个数就可以取 \(P - S \bmod P\),而如果 \(S\) 是 \(P\) 的倍数就不行了,要减去 \(a_{n - 1}\)。
接着 DP,设 \(dp[i][j]\) 表 \(B\) 填了 \(i\) 个数,\(\sum P - B_k = j\) 的方案数,由于 \(j\) 只有在 \(\ge N\) 时才有共享,转移可以用前缀和优化做到 \(O(N^2)\)。
答案为:

浙公网安备 33010602011771号