思路:
设
f[i][j][k][l]
为已经放置了
i
个男生,
那么转移方程为
f[i][j+1][Max(k−1,0)][l+1]+=f[i][j][k][l]
最后答案为
ans=∑ki=0∑kj=0f[n][m][i][j]
#include <cstdio>
using namespace std;
template <class T>T Max(const T &a, const T &b) {return a > b ? a : b;}
const int SN = 150 + 10;
const int SM = 20 + 5;
const int MOD = 12345678;
int f[SN][SN][SM][SM], n, m, k, ans;
void Read(int &x) {
int in = 0,f = 1;char ch = getchar();
while(ch<'0' || ch>'9') {if(ch=='-') f = -1;ch = getchar();}
while(ch>='0' && ch<='9') {in = in*10+ch-'0';ch = getchar();}
x = in*f;
}
int main() {
Read(n),Read(m),Read(k);
f[1][0][1][0] = f[0][1][0][1] = 1;
for(int i = 0; i <= n; i++)
for(int j = 0; j <= m; j++)
for(int p = 0; p <= k; p++)
for(int q = 0; q <= k; q++) {
f[i+1][j][p+1][Max(q-1,0)] = (f[i+1][j][p+1][Max(q-1,0)] + f[i][j][p][q])%MOD;
f[i][j+1][Max(p-1,0)][q+1] = (f[i][j+1][Max(p-1,0)][q+1] + f[i][j][p][q])%MOD;
}
for(int i = 0; i <= k; i++)
for(int j = 0; j <= k; j++)
ans = (ans + f[n][m][i][j])%MOD;
printf("%d\n",ans);
return 0;
}