[清华集训2016]你的生命已如风中残烛

题目

传送门 to luogu

思路

省选/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,ir(χi1)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 χir 。因为刚好覆盖该位置时,必然有极长被覆盖后缀。该判据与操作顺序无关。

环上元素等价,总方案数 ( 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} mn+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 才是比较正经的想法,动机也比较充分。这个 “区间覆盖” 完全没有动机嘛!可是我这样数学不好的人,就完全没辙了……

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值