7.20 模拟赛
把全场最难题说一说。
《T1》
题意:给定 \(n, m\),求只包含 \(-1,m-1\) 的序列有多少个前缀和的最小值 \(\ge 0\).
给了你一个引理:对于任意 \(\sum x_i = 1\),恰好存在 \(1\) 个轮换 \(x'\),前缀和均为正数。
不妨先使 \(m\gets m-1\)。
总结:最终还是无法战胜打表哥……
不难想到按照前缀和为 \(0\) 的位置 dp,设 \(f_i\) 表示前面均合法,且 \([1, i]\) 的和为 \(0\) 的方案数,转移考虑枚举上一个为 \(0\) 的位置 \(j\),然后发现 \(s_i = 0 \Rightarrow a_i=-1\)(\(s\) 为前缀和),所以 \(s_{i-1} = 1\),结合 \(s_j=0\) 有:\(a_{j+1}+a_{j+2}+\dots+a_{i-1} = 1\),考虑使用如上引理,然后你就发现你得算设长度为 \(n\)、有 \(m\) 个 \(1\) 的 \(0/1\) 序列在循环移位等价下的不同个数。最后会日出来一个:
根本没法做(然而实际上我们后面发现因为 \(n,m\) 的特殊性质其实是可以做的)。最终还是无法战胜打表哥……
正解是考虑枚举第一个 \(i\),其中 \([1,i]\) 的和为 \(0\),\(a_{i+1}=-1\),即不合法,记这个答案为 \(F_i\),则 \(\mathrm{ans} = 2^n-\sum F_i 2^{n-i-1}\)。
考虑 \(F_{i}\) 怎么算,由于 \([1, i]\) 的和为 \(0\),容易计算出 \(a=\mathrm{cnt}_m=i/(m+1)\),\(b=\mathrm{cnt}_{-1}=\mathrm{cnt}_m \times m\)。就是要计数有 \(a\) 个 \(m\),\(b\) 个 \(-1\),且前缀和 \(\ge 0\),总和 \(=0\) 的方案数。在一个任意的满足个数限制的序列进行如下操作:
- 在后面补一个 \(-1\),
- 取相反数就可以发现总和为 \(1\),应用前面的引理可以找一个前缀和 \(> 0\) 的轮换序列;
- 第一位必然为 \(1\);
- 去掉第一位后,可以得到前缀和 \(\ge 0\) 的序列。
- 然后再取一次相反数,可以得到前缀和 \(\le 0\) 的序列,进行一次对称变换过后,可以得到前缀和 \(\ge 0\) 的序列。
注意:当长度为 \(n\) 的序列 \(\sum x_i\) 总和为 \(1\) 时,我们能够证明: \(x_i\) 的不同的循环变换个数恰好有 \(n\) 个。从总和为 \(1\) 的角度可以简单证明。
所以直接对于轮换序列计数,共有 \(a\) 个 \(m\),\(am+1\) 个 \(-1\),答案即为:
最后用上面的式子统计答案即可。

浙公网安备 33010602011771号