2018.10.30 uoj#273. 【清华集训2016】你的生命已如风中残烛(组合数学)

博客内容涉及清华集训的一道组合数学问题,通过将数减1转换问题,探讨了序列的循环同构和前缀和性质,指出只有特定序列合法,并分析了序列的方案数为m!,最后提到了代码实现。
摘要由CSDN通过智能技术生成

传送门
组合数学妙题。


我们把这 m m m个数都减去 1 1 1
然后出牌的地方就变成了 − 1 -1 1
然后发现求出每个位置的前缀和之后全部都是非负数。
考虑在最后加入一个 − 1 -1 1构成一个 m + 1 m+1 m+1个数的序列。
那么对于这个序列的所有循环同构。
只有当前这种是合法的。
原因很简单。
最后一个位置的前缀和是 − 1 -1 1,因此除了当前这种之外的循环同构必定有一个前缀和是负数。
反过来发现对于每一个不合法的,它一定有一个循环同构是合法的。
对于这个序列的总方案数只有 m ! m! m!种。
然后最后一个数种类是定了的。
因此总方案数: m ! m − n + 1 \frac {m!} {m-n+1} mn+1m!
代码:

#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
const int mod=998244353;
int n,ans=1,m=0;
int main(){
	n=read();
	for(int i=1;i<=n;++i)m+=read();
	for(int i=1;i<=m;++i)if(i^(m-n+1))ans=(long long)i*ans%mod;
	cout<<ans;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值