loading...

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\) 序列在循环移位等价下的不同个数。最后会日出来一个:

\[\dfrac{1}{n}\sum _{d | \gcd(n, m)} \varphi(d)\binom{n/d}{m/d} \]

根本没法做(然而实际上我们后面发现因为 \(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\),答案即为:

\[F_i = \binom{m+am+1}{a} \times \frac{1}{m+am+1}=\binom{m+am}{a}\times \frac{1}{am+1} \]

最后用上面的式子统计答案即可。

posted @ 2026-07-20 20:39  goldspade  阅读(8)  评论(0)    收藏  举报