您的位置:首页 > 其它

[弱校联萌2016]2016弱校联盟十一专场10.3

2016-10-03 17:19 363 查看
比赛链接:https://www.bnuoj.com/v3/contest_show.php?cid=8504#info

A.找两个数乘积是连续上升并且最大的。

1 #include <bits/stdc++.h>
2 using namespace std;
3
4 typedef long long LL;
5 typedef unsigned long long ULL;
6 const ULL mod = ULL(1e9+7);
7 const int maxn = 100100;
8 int n;
9 vector<int> G[maxn];
10 map<ULL, LL> h;
11 map<ULL, LL>::iterator it;
12
13 ULL dfs(int p, int u) {
14   ULL hs = 0;
15   for(int i = 0; i < G[u].size(); i++) {
16     int v = G[u][i];
17     if(v == p) continue;
18     hs += dfs(u, v);
19   }
20   hs *= mod;
21   h[++hs]++;
22   return hs;
23 }
24
25 int main() {
26   //freopen("in", "r", stdin);
27   int u, v;
28   while(~scanf("%d",&n)) {
29     h.clear();
30     for(int i = 1; i <= n; i++) G[i].clear();
31     for(int i = 0; i < n-1; i++) {
32       scanf("%d%d",&u,&v);
33       G[u].push_back(v);
34       G[v].push_back(u);
35     }
36     dfs(-1, 1);
37     LL ret = 0;
38     for(it = h.begin(); it != h.end(); it++) ret += (it->second * it->second);
39     cout << (ret - n) / 2 << endl;
40   }
41   return 0;
42 }


E
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: