微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

洛谷P6672 你的生命已如风中残烛

传送门

题目描述

期中考试考完了,已经感到没有什么好害怕的六花今天决定不学数学了,于是和勇太打起了游戏王。

“你已空手空场,生命只剩一百,事到如今你还能做什么?”

“所累哇多卡纳!”

“纳尼?”

然而六花的卡组实在是太菜了,经过分析,六花发现在一回合内,她卡组中的牌并没有办法达成 OTK,除非主角光环附体:

被封印的艾克佐迪亚

——包括这张卡在内,「被封印者的右足」「被封印者的左足」「被封印者的右腕」「被封印者的左腕」全在手牌的时候,获得决斗胜利。

在这里插入图片描述

但是因为六花不是高贵的氪金玩家,她可以肯定,这五张牌中肯定有一张,在牌堆的底端。所以六花现在面临着一个难题:需要在一回合内将卡组抽完。

六花的牌堆一共有 m+1m+1 张牌,因为最后一张牌是固定的,所以我们现在只考虑前 mm 张牌。

在这 mm 张牌中,有 nn 张特殊牌和 m-nm−n 张普通牌,每一个特殊牌有一个属性值 w_iw
i

,表示在打出这张牌后,可以再摸 w_iw
i

张牌。幸运的是,六花发现这些牌刚好满足 ∑\limits_{i=1}^nw_i=m
i=1

n

w
i

=m,因此她可以放心的随意摸牌而不用担心爆牌。

因为这 mm 张牌是被打乱的,所以总共有 m!m! 种不同的可能的牌堆。

在这回合开始了,六花先从牌堆里抽出一张牌,接着六花不断的打出手中的牌,如果打出特殊牌,则又可以摸牌,直到摸到最后一张牌达成胜利条件或者打光自己的手牌结束自己的回合继而输掉比赛。

举例来说,如果牌堆是 {4,0,0,2,0,0,0}{4,0,0,2,0,0,0}(用 00 表示普通牌,其他数字表示 wi,其中最后一个 00 是最后一个部件),那么六花打牌的过程可以为:

取一张牌,手中的牌为 {4}{4}。
打出 {4}{4},再取四张牌,手中的牌为 {0,0,2,0}{0,0,2,0}。
打出 {2}{2},还需要再取两张,这时已摸到最后一个部件,六花胜利。
而如果牌堆是 {2,0,0,4,0,0,0}{2,0,0,4,0,0,0},不难发现是勇太的胜利。
现在,六花想要知道这 m!m! 种不同的牌堆中,有多少种能够让她胜利。

输入格式

第一行一个整数 nn。

第二行 nn 个空格隔开的正整数 w_iw
i

通过输入你可以自己算出来 m=∑w_im=∑w
i

输出格式

输出一个整数表示答案,答案可能很大,你只需要输出对 998,244,353998244353 取模后的结果。

输入输出样例

输入 #1复制
1
5
输出 #1复制
24
输入 #2复制
6
1 2 3 4 5 6
输出 #2复制
90337303
说明/提示
样例 11 解释
所有可能的 m!m! 种牌堆中,只有形如 {5,0,0,0,0,0}{5,0,0,0,0,0} 的 2424 个牌堆满足条件。

数据范围

对于 10%10% 的数据,m \leq 10m≤10。

对于 30%30% 的数据,n \leq 8n≤8。

对于 50%50% 的数据,n \leq 15n≤15。

对于 70%70% 的数据,n \leq 30n≤30。

对于 100%100% 的数据,n \leq 40n≤40,1 \leq w_i \leq 10^51≤w
i

≤10
5
。同时保证有 m-n \geq 4m−n≥4,因为牌堆里毕竟要有这 55 个部件嘛。

代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,m=0;
	scanf("%d",&n);
	for(int i=1;i<=n;++i)
	{
		int a;
		scanf("%d",&a);
		m+=a;
	}
	long long ans=1;
	for(long long i=1;i<=m;++i)
	{
		if(m-n+1==i)	continue;
		ans*=i;
		ans%=998244353;
	}
	printf("%lld",ans);
	return 0;
}

原文地址:https://www.jb51.cc/wenti/3286380.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐