Codeforces Round #439 (Div. 2)C - The Intriguing Obsession(简单dp)

传送门

题意

给出三个集合,每个集合的元素数量为a,b,c,现在需要连边,满足集合内元素不可达或最短路为3,求可行方案数

分析

设dp[i][j]为a集合元素为i个,b集合元素为j个的可行方案,易知(a,b),(b,c),(c,a)的方案是独立的,且可行方案为a->b->c,或旋转形式,那么就求一个两个集合的连边方案数即可。
转移方程 dp[i][j]=dp[i-1][j]+dp[i-1][j-1]*j;

trick

代码

#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define F(i,a,b) for(int i=a;i<=b;++i)
#define R(i,a,b) for(int i=a;i<b;++i)
#define mem(a,b) memset(a,b,sizeof(a))

const ll mod = 998244353;
ll a,b,c;
ll dp[5050][5050];
int main()
{
	cin>>a>>b>>c;
	F(i,0,5000) dp[i][0]=dp[0][i]=1;
	F(i,1,5000)F(j,1,5000) dp[i][j]=(dp[i-1][j]+dp[i-1][j-1]*j%mod)%mod;
	ll ans=1;
	ans=ans*dp[a][b]%mod*dp[b][c]%mod*dp[c][a]%mod;
	cout<<ans<<endl; 
	return 0;
}
posted @ 2017-10-07 11:04  遗风忘语  阅读(119)  评论(0编辑  收藏  举报