题目
思路
省选/NOI-
?恶意评分 😭
正经题意转化是,设牌堆序列为 { χ } \{\chi\} {χ},用 χ = 0 \chi=0 χ=0 表示普通牌, χ = w i \chi=w_i χ=wi 表示第 i i i 张特殊牌,则限制条件为 ∀ r , ∑ i ⩽ r ( χ i − 1 ) ⩾ 0 \forall r,\;\sum_{i\leqslant r}(\chi_i{-}1)\geqslant 0 ∀r,∑i⩽r(χi−1)⩾0 。状压都搞不定,只想出 O [ n 2 ⋅ ( n ! ) ] \mathcal O[n^2\cdot (n!)] O[n2⋅(n!)] 的暴力 😢
题解会告诉你 Raney \text{Raney} Raney 原理:和为 1 1 1 的序列,其圆排列中恰有一个使得前缀和全部非负。我直接谔谔?
有一个更容易理解的,但也是很难想到的解释是,从左往右处理 χ i ≠ 0 \chi_i\ne 0 χi=0 的值:将右侧最近的 χ i \chi_i χi 个未被覆盖的元素(可以包括自己)设定为覆盖。目标是使得 [ 1 , m ] [1,m] [1,m] 全部被覆盖。这就与 Airplane Arrangements \text{Airplane Arrangements} Airplane Arrangements 比较相似了!加入 χ m + 1 = 0 \chi_{m+1}=0 χm+1=0,假定该过程在长度为 ( m + 1 ) (m{+}1) (m+1) 的环上进行,目标为 ( m + 1 ) (m{+}1) (m+1) 号点不被覆盖。注意此时不能再 “从左往右” 依次处理,因为环上位置必须等价,不能有一个位置作为起始点;从 w 1 w_1 w1 开始即可。
简单证明 “以任意顺序处理 χ \chi χ,不被覆盖的位置不变”:位置不被覆盖,等价于 ∀ r \forall r ∀r,其前面 r r r 个位置(不含自己)满足 ∑ χ i ⩽ r \sum\chi_i\leqslant r ∑χi⩽r 。因为刚好覆盖该位置时,必然有极长被覆盖后缀。该判据与操作顺序无关。
环上元素等价,总方案数
(
m
+
1
)
!
(m{+}1)!
(m+1)! 中每个位置为不被覆盖者的情况数相同,所以答案就是
m
!
m!
m! 吗?别忘了
χ
m
+
1
=
0
\chi_{m+1}=0
χm+1=0 是假的普通牌,它不能和别的普通牌一起乱排!每个普通牌都可以成为
(
m
+
1
)
(m{+}1)
(m+1) 处的幸运儿,所以实际上答案是
m
!
m
−
n
+
1
\frac{m!}{m-n+1}
m−n+1m!
时间复杂度
O
(
∑
w
i
)
\mathcal O(\sum w_i)
O(∑wi) 。可以说,出题人 很 baby 地 掩盖住了这个复杂度的真相。
代码
我真的很难想象,答案与 w i w_i wi 的具体值无关。
#include <cstdio> // I am faecal flora!!!
int main(){
int n, m = 0; long long res = 1; scanf("%d",&n);
for(int i=0,x; i!=n; ++i) scanf("%d",&x), m += x;
for(int i=2; i<=m; ++i) if(i != m-n+1) res = res*i%998244353;
printf("%d\n",int(res));
return 0;
}
后记
其实 Raney \text{Raney} Raney 才是比较正经的想法,动机也比较充分。这个 “区间覆盖” 完全没有动机嘛!可是我这样数学不好的人,就完全没辙了……