Codeforces Round #439 (Div. 2) C题

题意:红蓝粉村庄分别有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 }

 

posted on 2017-10-08 10:55  poler  阅读(190)  评论(0编辑  收藏  举报

导航