题意:有三种颜色的点,两点之间建无向边的长度为1,要求同色之间若能到达,他们之间最短距离的长度至少为3,求有几种建边方式。
首先容易得到同色之间若能到达,一定是经过了另外两种颜色的点,才能保证长度至少为3。换句话说,若红色的两个点都连到了黄色的同一个点上,就不符合要求。所以,红色的每个点最多和黄色的一个点相连,黄色同理。最后答案就是三个颜色两两之间可连的边数相乘。
令
dp[i][j]
表示第一种颜色有
i
个,第二种颜色有
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 998244353;
ll dp[5050][5050];
ll Dp(ll x,ll y){
if (x==0 || y==0) return 1;
if (dp[x][y] > 0) return dp[x][y];
dp[x][y] = ((Dp(x-1,y) + Dp(x-1,y-1) * y % mod) + mod) % mod;
return dp[x][y];
}
int main(){
ll a[3];
scanf("%lld %lld %lld",&a[0],&a[1],&a[2]);
sort(a,a+3);
ll ans = Dp(a[0],a[1]) * Dp(a[0],a[2]) % mod * Dp(a[1],a[2]) % mod;
printf("%lld\n",ans);
return 0;
}