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

 

posted @ 2018-01-03 21:14  Ren_Ivan  阅读(132)  评论(0编辑  收藏  举报