题意
给你三种颜色的岛屿,数量分别为,问你在这些岛屿的任意地方建桥一共有多少种方案
建桥要满足下面的条件
- 同一种颜色的距离
思路
先考虑和
之间建桥,可以发现
中的岛屿和
中的岛屿必须一一对应,不然就会违反条件, 所以我们可以枚举
和
直接的建桥数量
,这样就知道
和
之间建桥的方案数,其它
和
的方案数是相互独立,并且求解的方案一样
代码
/**
* author: andif
* created: 23.08.2023 23:00:33
**/
#include<bits/stdc++.h>
using namespace std;
#define de(x) cerr << #x << " = " << x << endl
#define dd(x) cerr << #x << " = " << x << " "
#define rep(i, a, b) for(int i = a; i < b; ++i)
#define per(i, a, b) for(int i = a; i > b; --i)
#define mt(a, b) memset(a, b, sizeof(a))
#define sz(a) (int)a.size()
#define fi first
#define se second
#define qc ios_base::sync_with_stdio(0);cin.tie(0)
#define eb emplace_back
#define all(a) a.begin(), a.end()
using ll = long long;
using db = double;
using pii = pair<int, int>;
using pdd = pair<db, db>;
using pll = pair<ll, ll>;
using vi = vector<int>;
const db eps = 1e-9;
const int mod = 998244353;
const int N = 5006;
int main() {
vector<vi> C(N, vi(N, 0));
C[1][0] = C[1][1] = 1;
rep(i, 2, N) {
C[i][0] = 1;
rep(j, 1, i + 1) {
C[i][j] = (0ll + C[i - 1][j] + C[i - 1][j - 1]) % mod;
}
}
vi f(N);
f[0] = 1;
rep(i, 1, N) f[i] = 1ll * i * f[i - 1] % mod;
auto gao = [&] (int a, int b) {
int ret = 0;
rep(i, 0, min(a, b) + 1) {
ret = (ret + 1ll * C[a][i] * C[b][i] % mod * f[i] % mod) % mod;
}
// dd(a), dd(b), de(ret);
return ret;
};
int a, b, c;
cin >> a >> b >> c;
int ans = 1;
// ab
ans = (1ll * ans * gao(a, b)) % mod;
// ac
ans = (1ll * ans * gao(a, c)) % mod;
// bc
ans = (1ll * ans * gao(b, c)) % mod;
cout << ans << '\n';
return 0;
}