AtCoder Regular Contest 145 C - Split and Maximize

https://atcoder.jp/contests/arc145/tasks/arc145_c

首先最大一定是,2i1,2i 配对。

可以通过交换任意 2 个数来反证。

那么就是要构造一个序列,倘若把 2i1,2i 看成 +1,1 的话,那么一个 +1 只能跟它最近的 1 配对到(也就是说,对于已经确定的序列,配对方案是固定的,且不同的 +1 序列对应的配对方案也是不同的)。不难发现这个方案数就是卡特兰数(要求前缀都大于等于 0),然后颜色全排列,2i1,2i 可以互换。然后就好了。

#include <bits/stdc++.h> #define int long long #define pb push_back using namespace std; const int mod=998244353; const int N=(int)(4e6+5); int n,jie[N],djie[N]; int C(int n,int m) { if(m>n||m<0||n<0) return 0; return jie[n]*djie[m]%mod*djie[n-m]%mod; } int fpow(int x,int y) { int res=1; while(y) { if(y&1) res=res*x%mod; x=x*x%mod; y>>=1; } return res; } int solve(int n) { return C(2*n,n)*fpow(n+1,mod-2)%mod; } signed main() { cin.tie(0); ios::sync_with_stdio(false); cin>>n; jie[0]=djie[0]=1; for(int i=1;i<=4*n;i++) jie[i]=jie[i-1]*i%mod,djie[i]=fpow(jie[i],mod-2); cout<<jie[n]*fpow(2,n)%mod*solve(n)%mod; }

__EOF__

本文作者F x o r G
本文链接https://www.cnblogs.com/xugangfan/p/16536284.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   FxorG  阅读(157)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
历史上的今天:
2021-07-31 【模板】二次剩余
2021-07-31 P3241 [HNOI2015]开店
2021-07-31 P4248 [AHOI2013]差异
2021-07-31 P6640 [BJOI2020] 封印
2021-07-31 CF427D Match & Catch
2021-07-31 P2178 [NOI2015] 品酒大会
2021-07-31 Loj#6071. 「2017 山东一轮集训 Day5」字符串
点击右上角即可分享
微信分享提示