bzoj2467 [中山市选2010]生成树

Posted Ren_Ivan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj2467 [中山市选2010]生成树相关的知识,希望对你有一定的参考价值。

没想那么多,直接上了$Matrix-Tree$

上网一搜,发现有结论,最终结果是树当且仅当有一个五边形被删了两条边且一条在中心环上,剩下的五边形各删一条边,所以是$n*4*5^{n-1}$

好有道理,本来说T了的话打表呢,结果过了,好尴尬。

技术分享图片
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<cmath>
 6 #define mod 2007
 7 #define N 405
 8 using namespace std;
 9 int ans=1,n,a[N][N];
10 void gauss(){
11     n=4*n-1;
12     for(int i=1;i<=n;i++)
13         for(int j=1;j<=n;j++)
14             (a[i][j]+=mod)%=mod;
15     for(int k=1;k<=n;k++){
16         for(int i=k+1;i<=n;i++){
17             while(a[i][k]){
18                 int t=a[k][k]/a[i][k];
19                 for(int j=k;j<=n;j++){
20                     a[k][j]=(a[k][j]-t*a[i][j]%mod+mod)%mod;
21                     swap(a[k][j],a[i][j]);
22                 }
23                 ans=(-ans+mod)%mod;
24             }
25         }
26         (ans*=a[k][k])%=mod;
27     }
28 }
29 void add(int x,int y){
30     a[x][x]++;a[y][y]++;
31     a[x][y]--;a[y][x]--;
32 }
33 int T;
34 int main(){
35     scanf("%d",&T);
36     while(T--){
37         scanf("%d",&n);
38         ans=1;memset(a,0,sizeof a);
39         for(int i=1;i<4*n;i++)add(i,i+1);add(4*n,1);
40         for(int i=1;i<4*(n-1);i+=4)add(i,i+4);add(4*n-3,1);
41         gauss();
42         printf("%d\n",ans);
43     }
44     return 0;
45 }
View Code

 

以上是关于bzoj2467 [中山市选2010]生成树的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ2467 [中山市选2010]生成树

BZOJ2467[中山市选2010]生成树 矩阵树定理

bzoj2467 [中山市选2010]生成树

BZOJ2467 [中山市选2010]生成树

中山市选2010BZOJ2467生成树

bzoj2467 [中山市选2010]生成树