Description
今天是hidadz小朋友的生日,她邀请了许多朋友来参加她的生日party。 hidadz带着朋友们来到花园中,打算坐成一排玩游戏。为了游戏不至于无聊,就座的方案应满足如下条件:对于任意连续的一段,男孩与女孩的数目之差不超过k。很快,小朋友便找到了一种方案坐了下来开始游戏。hidadz的好朋友Susie发现,这样的就座方案其实是很多的,所以大家很快就找到了一种,那么到底有多少种呢?热爱数学的hidadz和她的朋友们开始思考这个问题…… 假设参加party的人中共有n个男孩与m个女孩,你是否能解答Susie和hidadz的疑问呢?由于这个数目可能很多,他们只想知道这个数目除以12345678的余数。
Input
仅包含一行共3个整数,分别为男孩数目n,女孩数目m,常数k。
Output
应包含一行,为题中要求的答案。
Sample Input
1 2 1
Sample Output
1
HINT
n , m ≤ 150,k ≤ 20。
正解:$DP$。
设$f[i][j][k1][k2]$表示$i$个男孩,$j$个女孩,男孩与女孩差为$k1$,女孩与男孩差为$k2$,暴力转移即可。
//It is made by wfj_2048~
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define rhl (12345678)
#define inf (1<<30)
#define il inline
#define RG register
#define ll long long
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout) using namespace std; int f[][][][],n,m,k,ans; il int gi(){
RG int x=,q=; RG char ch=getchar();
while ((ch<'' || ch>'') && ch!='-') ch=getchar();
if (ch=='-') q=-,ch=getchar();
while (ch>='' && ch<='') x=x*+ch-,ch=getchar();
return q*x;
} il void work(){
n=gi(),m=gi(),k=gi(),f[][][][]=;
for (RG int i=;i<=n;++i)
for (RG int j=;j<=m;++j)
for (RG int k1=;k1<=k;++k1)
for (RG int k2=;k2<=k;++k2){
if (k!=k1 && i<n) (f[i+][j][k1+][max(k2-,)]+=f[i][j][k1][k2])%=rhl;
if (k!=k2 && j<m) (f[i][j+][max(k1-,)][k2+]+=f[i][j][k1][k2])%=rhl;
}
for (RG int k1=;k1<=k;++k1)
for (RG int k2=;k2<=k;++k2){ ans+=f[n][m][k1][k2]; if (ans>=rhl) ans-=rhl; }
printf("%d\n",ans); return;
} int main(){
File("birthday");
work();
return ;
}