2018.11.1每天认真做一道数学(数论)题之UOJ #273. BZOJ 4735【清华集训2016】你的生命已如风中残烛【组合数学】

“这道题怎么做啊…只会10%的状压啊”
“wxh用状压过了”
“…”

然后我苦苦思索仍然无解,去膜了题解之后才弄懂。

我们把这mm个数都1-1,于是变成了求这m!m!个排列中有多少排列满足所有前缀和0\geq 0

容易同加油站的题一样证明,这样满足条件的循环同构的解是惟一的。

再考虑最底下一张牌,得出答案:ans=m!m+1nans=\frac{m!}{m+1-n}

#include <bits/stdc++.h>
#define ll long long
using namespace std;

const ll N=1e2+5;
const ll Inf=1e18;
const ll Mod=998244353;

ll n,m,ans=1,w[N];

inline ll mul(ll x,ll y) {
	return x*y%Mod;
}

int main() {
	scanf("%lld",&n);
	
	for(ll i=1;i<=n;i++) scanf("%lld",&w[i]),m+=w[i];
	
	for(ll i=1;i<=m;i++) if(i^(m+1-n)) 	ans=mul(ans,i);
	
	printf("%lld\n",ans);
	
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章