题解:CF1765C Card Guessing
Grammar_hbw · · 题解
考虑计算对于所有排列总的猜对次数,答案除以
考虑每种长度为
下一个位置的花色必须在这
连续段的位置有
这
所以,当这
对于原排列前
至此已经
:::info[Code Time]
#include <bits/stdc++.h>
using namespace std;
const int N=2007,wac=998244353;
int f[N][N],_fa[N],*fa=_fa+1,fi[N]; // 虽然在涉及到 -1 的阶乘时一定没有贡献,但要防 RE。
int qpow(int a,int b){
int ans=1;
for(;b;b>>=1,a=1ll*a*a%wac) if(b&1) ans=1ll*ans*a%wac;
return ans;
}
int c(int n,int m){
if(n>m) return 0;
return 1ll*fa[m]*fi[n]%wac*fi[m-n]%wac;
}
int main(){
int n,k;
cin>>n>>k;
fa[0]=1;
for(int i=1;i<N;i++) fa[i]=1ll*i*fa[i-1]%wac;
fi[N-1]=qpow(fa[N-1],wac-2);
for(int i=N-1;i;i--) fi[i-1]=1ll*i*fi[i]%wac;
int ans=0;
for(int i=0;i<=n;i++) for(int j=i;j<=n;j++) for(int l=j;l<=n&&i+j+l<=k;l++){
int m=i+j+l;
if(m+l<=k){
int qwq=1ll*c(i,n)*c(j,n)%wac*c(l,n)%wac*c(l,n)%wac*fa[m+l]%wac*fa[4*n-m-l-1]%wac*(n-i)%wac; // 考虑 (x,y,z,z) 型贡献。
int awa;
if(i==l) awa=1;
else if(i==j) awa=6;
else if(j==l) awa=4;
else awa=12;
ans=(ans+1ll*qwq*awa%wac*(m+l==k?(4*n-k):1))%wac;
}
int qwq=1ll*c(i,n)*c(j,n)%wac*c(l,n)%wac*(n-i)%wac;
int awa;
if(i==l) awa=4;
else if(i==j||j==l) awa=12;
else awa=24;
f[m][l]=(f[m][l]+1ll*qwq*awa)%wac; // 处理 f_{i,j}。
}
for(int i=0;i<=k;i++) for(int j=0;j<=n;j++) for(int l=j+1;l<=n&&i+l<=k;l++) ans=(ans+1ll*f[i][j]*c(l,n)%wac*fa[i+l]%wac*fa[4*n-i-l-1]%wac*(i+l==k?(4*n-k):1))%wac;
cout<<1ll*ans*fi[4*n]%wac<<'\n'; // 答案除以 (4n)!。
}
:::