先求出任意两两之间的映射的种类数,然后求一下三种的乘积就可以了。
总想着内存是5000*5000*5000,没想到先求两两之间的,菜的一笔。
直接拿dp[i][j] 代表有i个红颜色小岛,j个蓝颜色小岛的情况下有多少种。
新增的小岛有两种情况:1.不和其他小岛相连
2.和另一种颜色的某个小岛相连
dp[i][j] = ( dp[i-1][j] + ( dp[i-1][j-1] * j % mod) ) % mod;
#include <bits/stdc++.h>
using namespace std;
long long dp[5002][5020];
long long a[5];
const long long mod = 998244353;
int main()
{
cin >> a[0] >> a[1] >> a[2];
for(int i = 0; i <= 5000 ; i++)
{
dp[i][0] = 1;
// dp[i][1] = i+1;
}
for(int i = 0 ; i <= 5000 ; i++)
{
dp[0][i] = 1;
// dp[1][i] = i+1;
}
for(int i = 1 ; i <= 5000 ; i++)
{
for(int j = 1 ; j <= 5000 ; j++)
{
dp[i][j] = (dp[i-1][j] + (dp[i-1][j-1] * j ) % mod) % mod;
}
}
long long a1 = dp[ a[0] ][ a[1] ];
long long a2 = dp[a[0]][a[2]];
long long a3 = dp[ a[1] ][ a[2] ];
printf("%lld\n",(a1 * a2) % mod * a3 % mod);
}