题意:n男生m女生排成一个序列 要求这个序列的任意连续一段的男生女生数量之差不超过K求有多少种排列方式
mod(12345678)
考虑 f[len][男生][以len结尾的后缀男生比女生最多多多少][以len结尾的后缀女生比男生最多多多少]
每一个状态想后转移要么添加在尾巴填一个男生 or一个女生
#include<stdio.h>
#include<iostream>
#define en '\n'
using namespace std;
#define ll long long
const int mo=12345678;
int n,m,K;
const int maxn =152;
int f[302][maxn][22][22];
signed main(){
#ifdef local
freopen("input2.txt","r",stdin);
#endif // local
scanf("%d%d%d",&n,&m,&K);
#define int register int
f[0][0][0][0]=1;
for(int i=0;i<=n+m;++i){
for(int j=0;j<=m;++j){
for(int k=0;k<=K;++k){
for(int l=0;l<=K;++l){
if(f[i][j][k][l]==0)continue;
if (j+1<=m)
(f[i+1][j+1][k+1][max(0,l-1)]+=f[i][j][k][l])%=mo;
if( j<=m)
(f[i+1][j][max(0,k-1)][l+1]+=f[i][j][k][l])%=mo;
}
}
}
}
ll ans=0;
for(int k=0;k<=K;k++){
for(int l=0;l<=K;l++){//cout<<' '<<f[n+m][m][k][l]<<en;
ans=(ans+f[n+m][m][k][l])%mo;
}
}
cout<<ans<<en;
return 0;
}