Luogu P2592 [ZJOI2008]生日聚会
Posted labelray
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Luogu P2592 [ZJOI2008]生日聚会相关的知识,希望对你有一定的参考价值。
题目描述
今天是hidadz小朋友的生日,她邀请了许多朋友来参加她的生日party。 hidadz带着朋友们来到花园中,打算坐成一排玩游戏。为了游戏不至于无聊,就座的方案应满足如下条件:
对于任意连续的一段,男孩与女孩的数目之差不超过k。
很快,小朋友便找到了一种方案坐了下来开始游戏。hidadz的好朋友Susie发现,这样的就座方案其实是很多的,所以大家很快就找到了一种,那么到底有多少种呢?热爱数学的hidadz和她的朋友们开始思考这个问题……
假设参加party的人中共有n个男孩与m个女孩,你是否能解答Susie和hidadz的疑问呢?由于这个数目可能很多,他们只想知道这个数目除以12345678的余数。
输入输出格式
输入格式:
输入文件party.in仅包含一行共3个整数,分别为男孩数目n, 女孩数目m, 常数k。
输出格式:
输出文件party.out应包含一行,为题中要求的答案。
输入输出样例
说明
对于30%的数据,n , m ≤ 20;
对于100%的数据, n , m ≤ 150,k ≤ 20。
#include <iostream> #include <cstdio> #define MOD 12345678 using namespace std; int n,m,k,f[310][160][22][22]; void read(int &A); int main(){ read(n);read(m);read(k); f[0][0][0][0]=1; for(int i=0;i<=m+n-1;i++) for(int j=0;j<=n;j++) for(int x=0;x<=k;x++) for(int y=0;y<=k;y++){ (f[i+1][j+1][x+1][max(y-1,0)]+=f[i][j][x][y])%=MOD; (f[i+1][j][max(x-1,0)][y+1]+=f[i][j][x][y])%=MOD; } int ans=0; for(int i=0;i<=k;i++) for(int j=0;j<=k;j++) (ans+=f[m+n][n][i][j])%=MOD; cout<<ans<<endl; return 0; } void read(int &A){ A=0;char CH=getchar(); while(CH<‘0‘||CH>‘9‘)CH=getchar(); while(CH>=‘0‘&&CH<=‘9‘){A=A*10+CH-‘0‘;CH=getchar();} }
以上是关于Luogu P2592 [ZJOI2008]生日聚会的主要内容,如果未能解决你的问题,请参考以下文章
[luogu2592 ZJOI2008] 生日聚会 (计数dp)