列表

详情


NC20479. [ZJOI2008]生日聚会PARTY

描述

今天是hidadz小朋友的生日,她邀请了许多朋友来参加她的生日party。 hidadz带着朋友们来到花园中,打算坐成一排玩游戏。为了游戏不至于无聊,就座的方案应满足如下条件:
对于任意连续的一段,男孩与女孩的数目之 差不超过k。
很快,小朋友便找到了一种方案坐了下来开始游戏。hidadz的好朋友Susie发现,这样的就座方案其实 是很多的,所以大家很快就找到了一种,那么到底有多少种呢?
热爱数学的hidadz和她的朋友们开始思考这个问题 …… 
假设参加party的人中共有n个男孩与m个女孩,你是否能解答Susie和hidadz的疑问呢?由于这个数目可能很多,他们只想知道这个数目除以12345678的余数。

输入描述

仅包含一行共3个整数,分别为男孩数目n,女孩数目m,常数k。

输出描述

应包含一行,为题中要求的答案。

示例1

输入:

1 2 1

输出:

1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 105ms, 内存消耗: 57452K, 提交时间: 2023-06-24 22:07:19

#include<bits/stdc++.h>
using namespace std;
const int N=3e5;
const int M=1e6;
const int mod=12345678;
const int INF=0x3f3f3f3f;
int n,m,k;
int dp[155][155][25][25];
int main(){
    ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>m>>k;
	dp[0][0][0][0]=1;
	for(int i=0;i<=n;i++)
		for(int j=0;j<=m;j++)
			for(int k1=0;k1<=k;k1++)
				for(int k2=0;k2<=k;k2++){
					int tmp=dp[i][j][k1][k2];
					dp[i+1][j][k1+1][max(0,k2-1)]=(dp[i+1][j][k1+1][max(0,k2-1)]+tmp)%mod;
					dp[i][j+1][max(0,k1-1)][k2+1]=(dp[i][j+1][max(0,k1-1)][k2+1]+tmp)%mod;
				}
	int ans=0;
	for(int i=0;i<=k;i++)
		for(int j=0;j<=k;j++)
			ans=(ans+dp[n][m][i][j])%mod;
	cout<<ans;
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 36ms, 内存消耗: 10084K, 提交时间: 2020-04-01 17:14:32

#include<cstdio>
#include<algorithm>
using namespace std;
int f[151][151][21][21],n,m,K,ans;
int main()
{
	scanf("%d%d%d",&n,&m,&K);
	f[0][0][0][0]=1;
	for(int i=0;i<=n;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]) continue;
		if(i<n&&k<K) f[i+1][j][k+1][max(l-1,0)]=(f[i+1][j][k+1][max(l-1,0)]+f[i][j][k][l])%12345678;
		if(j<m&&l<K) f[i][j+1][max(k-1,0)][l+1]=(f[i][j+1][max(k-1,0)][l+1]+f[i][j][k][l])%12345678; 
	}
	for(int i=0;i<=K;i++)
	for(int j=0;j<=K;j++)
	ans=(ans+f[n][m][i][j])%12345678;
	printf("%d",ans);
}

上一题