Split and Maximize
根据常识可知,肯定是 \(\sum_{i=1}^n 2i(2i-1)\) 最大,通俗来讲就是相邻两个数相乘是最优的。
要达到这个得分,我们应该将 \(2i\) 和 \(2i-1\) 一个分给 \(A\),一个分给 \(B\),并且要保证先后顺序一样,保证 \(2i\) 可以与 \(2i-1\) 配对。
把 \(2i\) 看作 (
,把 \(2i-1\) 看作 )
,答案一定是一个合法的括号序列。
长度为 \(2n\) 的合法括号序列个数可以用卡特兰数解决,等于 \(\dbinom{2n}{n}-\dbinom{2n}{n-1}=\dfrac{(2n)!}{n!\times n!}-\dfrac{(2n)!}{(n+1)!\times (n-1)!}=\dfrac{(n+1)(2n)!}{n!\times (n+1)!}-\dfrac{n(2n)!}{(n+1)!\times n!}=\dfrac{(2n)!}{(n+1)!\times n!}\)。
对于一个合法的括号序列,由于 (
两两意义不同,答案需乘上 \(n!\) 表示 (
的排列数,一旦 (
的顺序确定了,)
的顺序也唯一了,因此不需要讨论 )
的排列数。因为 \(2i\) 和 \(2i-1\) 的位置可以调换,所以答案应该再乘上 \(2^n\)。
最终答案是 \(\dfrac{(2n)!}{(n+1)!\times n!}\times n!\times 2^n\)。
时间复杂度 \(O(n)\)。
Code
#include<bits/stdc++.h>
#define sf scanf
#define pf printf
using namespace std;
typedef long long ll;
const int N=2e5+3,mod=998244353;
int n;
ll jc(ll a){
ll s=1;
for(int i=1;i<=a;i++){
s=s*i%mod;
}
return s;
}
ll ksm(ll a,ll b){
ll s=1;
while(b){
if(b&1) s=s*a%mod;
a=a*a%mod;
b>>=1;
}
return s;
}
int main(){
sf("%d",&n);
pf("%lld\n",jc(2*n)*ksm(jc(n)*jc(n+1)%mod,mod-2)%mod*jc(n)%mod*ksm(2,n)%mod);
}
标签:dfrac,times,Split,Maximize,2n,jc,2i,mod
From: https://www.cnblogs.com/liyixin0514/p/18468538