题解:P17856 [LBA-OI R6 D] 奶龙游戏
对于一种分配方式,我们考虑可以怎么贡献。由于 Alice 后选,并且知道 Bob 是什么,所以它可以直接确定获胜几场,但是这个获胜肯定是有上下限,我们尝试推出这个上下限先,然后根据上下限让每种方案去贡献,说不定还会有一些神秘性质。
首先假设 Alice 的集合是
同理我们可以找到下界,也就是 Bob 最多赢
我们可以合理猜想一下,这个是一段连续区间,即
我们现在考虑怎么统计每个方案的贡献,每个方案贡献的是一段区间
我们模拟插入过程,每次就是将
同理,也可以得到
于是问题可以得到转化,每次插入一个数,相当于给和
这个形式就可以进一步进行经典的转化,将其转化成坐标轴上,每次
接下来就是经典的反射容斥,答案即是
code:
const int N=4e6+5,mod=998244353;
int n,frac[N],inv[N];
int qpow(int a,int b){
int ans=1;
for(;b;b>>=1){
if(b&1) ans=ans*a%mod;
a=a*a%mod;
}
return ans;
}
int C(int n,int m){
if(n<0 || m<0 || n<m) return 0;
if(m==0 || n==m) return 1;
return frac[n]*inv[m]%mod*inv[n-m]%mod;
}
signed main(){
IOS;
cin>>n;
frac[0]=frac[1]=1,inv[0]=inv[1]=1;
for(int i=2;i<=2*n;i++) frac[i]=frac[i-1]*i%mod;
inv[2*n]=qpow(frac[2*n],mod-2);
for(int i=2*n-1;i>=1;i--) inv[i]=inv[i+1]*(i+1)%mod;
int bs=C(2*n,n),ibs=qpow(bs,mod-2);
for(int k=0;k<=n;k++){
int ans=(bs-C(2*n,k-1)-C(2*n,n-k-1)+2*mod)%mod;
cout<<ans*ibs%mod<<"\n";
}
return 0;
}