题解:P6672 [清华集训2016] 你的生命已如风中残烛
题解:P6672 [清华集训2016] 你的生命已如风中残烛
标签
组合数学
分析
首先引入一个引理。
Raney 引理
对于一个长度为 \(n\) 的序列 \(a\),如果 \(\sum\limits_{i=1}^{n}=1\),那么这个序列 \(a\) 的所有循环位移中恰好有一种满足其前缀和序列的所有元素都是正数。
现在看看这道题。题意就是你共有 \(m\) 张牌,\(n\) 张特殊牌。普通牌为 \(0\),特殊牌有一个值 \(w_i\),可以再取 \(w_i\) 张牌,问这些牌有多少种排列情况可以一次取完。
我们可以把每个 \(w_i\) 都减 \(1\)。这样每个普通牌就会变成 \(-1\),刚好相当于牌的数量减少 \(1\)。形象来说,可以把特殊牌看做“欠的债”,普通牌就是每次还一个债,当债还完了刚好就是 \(-1\),此时也相当于手牌出完了。
拿题目所给的序列 \(\{4,0,0,2,0,0,0\}\) 为例,每一位 \(-1\) 后为 \(\{3,-1,-1,1,-1,-1,-1\}\)。
模拟一下出牌过程中还需要取的牌数:\(3\Rightarrow 2\Rightarrow 1 \Rightarrow 2\Rightarrow 1\Rightarrow 0\Rightarrow -1\)。
发现这就是前缀和,而且要赢就需要前 \(m\) 个每个前缀和都非负。设 \(w_i\) 的前缀和是 \(S_i\)。因为最后肯定全部出完所以最后的前缀和 \(S_n\) 肯定是 \(-1\) 可以忽略,并且最后一张牌肯定不会是特殊牌,所以 \(S_{n-1}\) 肯定是 \(0\)。很像刚刚说的 \(\texttt{Raney}\) 引理。不过有区别的两点是,现在的 \(\sum w_i=0\),并且所求结果限制为非负而不是正数。
为了套用 \(\texttt{Raney}\) 引理,很容易想到在序列开头固定一个 \(1\),这样最终序列和为 \(1\) 且限制条件由非负变正数,答案就是构造后的序列的圆排列数量。不过在加了 \(1\) 之后,方案数会变多,因为在合法的方案中你无法保证这个 \(1\) 一定在开头。考虑反例:\(\{1,3,-1,-1,1,-1,-1\}\),其中有两种合法方案,\(\{3,-1,-1,1,-1,{\color{red}1},-1\}\) 和 \(\{3,-1,-1,1,{\color{red}1},-1,-1\}\)。会发现把新加的 \({\color{red}1}\) 去掉之后其实是一种情况。
思考什么会保证位置不变,能想到在末尾加一个 \(-1\)。因为这个 \(-1\) 如果放在前面一定会使答案更劣所以位置肯定会保持在末尾。但这样怎么套用 \(\texttt{Raney}\) 引理呢?比较好想的一种办法可以把整个序列都取反(包括新加的 \(-1\)),这样序列之和就从原来的 \(-1\) 变成 \(1\),此时可以将这个序列倒置过来,这样开头就一定是 \(1\),再用前缀和(就是原序列后缀和)就可以套用 \(\texttt{Raney}\) 引理了。
现在我们这个序列圆排列的数量是 \(m!\)(因为 \(-1\) 被固定在了末尾),根据\(\texttt{Raney}\) 引理每个圆排列都有一种合法的情况。因为我们新加的 \(-1\) 和原本 \(m-n\) 普通牌代表的 \(-1\) 有所重复,所以要除去重复的情况 \(m-n+1\) 种,最终结果就是 \(\dfrac{m!}{m-n+1}\)。
直接计算输出即可,不贴代码了。