• 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
    ",ans);
    43     }
    44     return 0;
    45 }
    View Code
  • 相关阅读:
    CH6301 疫情控制
    [BeiJing2010组队]次小生成树 Tree
    CH6303 天天爱跑步
    CH6302 雨天的尾巴
    POJ3417 Network
    Problem 1999. -- [Noip2007]Core树网的核
    [Apio2010]patrol 巡逻
    「TJOI2018」str
    NOI2018 你的名字
    BZOJ5137 [Usaco2017 Dec]Standing Out from the Herd
  • 原文地址:https://www.cnblogs.com/Ren-Ivan/p/8185728.html
Copyright © 2020-2023  润新知