首页 > 其他 > 详细

第四周 2.7-2.13

时间:2016-02-07 13:31:51      阅读:215      评论:0      收藏:0      [点我收藏+]

寒假过半。惶恐。

 

2.7

HDU 5622 KK‘s Chemical

只要不成环,每个点贡献就是K - 1.

所以先处理好环的。再找出每个环,数长度,算贡献。

技术分享
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 typedef long long LL;
 6 const LL mod = 1e9 + 7;
 7 int N, K, tmp, G[101][101], dep[101];
 8 LL a[101], ans;
 9 
10 void dfs(int p, int d)
11 {
12     if(dep[p])
13     {
14         if(dep[p] == -1) return;
15         tmp += d - dep[p];
16         if(!ans) ans += a[d-dep[p]];
17         else ans = ans * a[d-dep[p]] % mod;
18         return;
19     }
20     dep[p] = d;
21     for(int i = 0; i < N; i++)
22     {
23         if(!G[p][i]) continue;
24         dfs(i, d + 1);
25     }
26     dep[p] = -1;
27 }
28 
29 int main(void)
30 {
31     int T;
32     scanf("%d", &T);
33     while(T--)
34     {
35         scanf("%d %d", &N, &K);
36         memset(G, 0, sizeof(G));
37         for(int i = 0; i < N; i++)
38         {
39             int to;
40             scanf("%d", &to);
41             G[i][to] = 1;
42         }
43         a[2] = K * (K - 1), a[3] = a[2] * (K - 2);
44         for(int i = 4; i <= N; i++)
45             a[i] = ( a[i-2] * (K - 1) + a[i-1] * (K - 2) ) % mod;
46         ans = 0LL, tmp = 0;
47         memset(dep, 0, sizeof(dep));
48         for(int i = 0; i < N; i++) dfs(i, 1);
49         for(int i = tmp; i < N; i++) ans = ans * (K - 1) % mod;
50         printf("%I64d\n", ans);
51     }
52     return 0;
53 }
Aguin

 

第四周 2.7-2.13

原文:http://www.cnblogs.com/Aguin/p/5184633.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!