题解 | #The Intriguing Obsession#

The Intriguing Obsession

https://ac.nowcoder.com/acm/problem/229273

题意

给你三种颜色的岛屿,数量分别为,问你在这些岛屿的任意地方建桥一共有多少种方案

建桥要满足下面的条件

  • 同一种颜色的距离

思路

先考虑之间建桥,可以发现中的岛屿和中的岛屿必须一一对应,不然就会违反条件, 所以我们可以枚举直接的建桥数量,这样就知道之间建桥的方案数,其它的方案数是相互独立,并且求解的方案一样

代码

/**
 *    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;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务