题意:红蓝粉村庄分别有a,b,c个,建桥要求同色的村庄,要么不可达,要么最短路至少为3,问建立道路的方案数。
分析:题意很明显就是,同色村庄内部不能连边,只能异色村庄染色,而且要保证是个偶图。
那其实就是问分别为(a,b) (a,c) (b,c)的点集,偶图的数目,组合数搞一下就好了。
注意取模,大数据验证下是否合法。
1 #include<bits/stdc++.h> 2 #define LL long long 3 #define maxn 5100 4 const LL Mod = 998244353; 5 using namespace std; 6 LL pre[maxn],C[maxn][maxn]; 7 LL ans = 1, res; 8 int n, a, b, c; 9 int main(){ 10 pre[0] = 1; 11 for(int i = 1; i <= 5000; i ++){ 12 pre[i] = (pre[i-1] * (LL)i) % Mod; 13 } 14 C[0][0] = 1; 15 for(int i = 1; i <= 5000; i ++){ 16 C[i][0] = C[i][i] = 1; 17 for(int j = 1; j < i; j ++){ 18 C[i][j] = (C[i-1][j-1] + C[i-1][j]) % Mod; 19 } 20 } 21 cin >> a >> b >> c; 22 n = min(a,b), res = 0; 23 for(int i = 0; i <= n; i ++){ 24 res = ((res + ((((C[a][i] * C[b][i]) % Mod) * pre[i]) % Mod)) % Mod); 25 } 26 ans = (ans * res) % Mod; 27 n = min(c,b), res = 0; 28 for(int i = 0; i <= n; i ++){ 29 res = ((res + ((((C[c][i] * C[b][i]) % Mod) * pre[i]) % Mod)) % Mod); 30 } 31 ans = (ans * res) % Mod; 32 n = min(a,c), res = 0; 33 for(int i = 0; i <= n; i ++){ 34 res = ((res + ((((C[a][i] * C[c][i]) % Mod) * pre[i]) % Mod)) % Mod); 35 } 36 ans = (ans * res) % Mod; 37 cout << ans % Mod; 38 return 0; 39 }