• Codeforces917D. Stranger Trees


    $n leq 100$的完全图,对每个$0 leq K leq n-1$问生成树中与给定的一棵树有$K$条公共边的有多少个,答案$mod 1e9+7$。

    对这种“在整体中求具有某些特性的部分”,可以通过把“特性”强行复制加入“整体”来考察新的整体与部分的关系。

    说人话,在这里是要求完全图中与给定树有若干同样边的生成树,那尝试把这棵树复制一份进完全图再看生成树。可以发现,这样之后,新的完全图的生成树个数就是

    $sum_{i=0}^{n-1}2^i*[number of trees which have i common edges with the original tree]$

    因为有$i$条公共边的话他在这张图里面这些公共边都有两种选择。类似得可以发现原完全图的生成树个数实际上就是所有要求的系数之和,原完全图相当于复制0次。依次类推,设$F(x)$为把树边复制$x-1$次得到完全图的生成树个数,那么

    $F(x)=sum_{i=0}^{n-1}x^i*[number of trees which have i common edges with the original tree]$

    现在要求这些系数,但我们知道了n个自变量$x$和他们对应的$F(x)$(用无向图生成树计数--矩阵树定理),可以用多项式插值求出系数。我只会高斯消元求插值,因此复杂度$n^3+n^4$。

      1 //#include<iostream>
      2 #include<cstring>
      3 #include<cstdlib>
      4 #include<cstdio>
      5 //#include<map>
      6 #include<math.h>
      7 //#include<time.h>
      8 //#include<complex>
      9 #include<algorithm>
     10 using namespace std;
     11 
     12 int n,m;
     13 #define maxn 111
     14 const int mod=1e9+7;
     15 int ji[maxn][maxn],duo[maxn][maxn];
     16 
     17 int powmod(int a,int b)
     18 {
     19     int ans=1;
     20     while (b)
     21     {
     22         if (b&1) ans=1ll*ans*a%mod;
     23         a=1ll*a*a%mod; b>>=1;
     24     }
     25     return ans;
     26 }
     27 
     28 int hh(int n)
     29 {
     30     int ans=1;
     31     for (int i=1;i<=n;i++)
     32     {
     33         if (ji[i][i]==0) for (int j=i+1;j<=n;j++) if (ji[j][i])
     34         {
     35             ans=ans==1?mod-1:1;
     36             for (int k=i;k<=n;k++) {int t=ji[i][k]; ji[i][k]=ji[j][k]; ji[j][k]=t;}
     37             break;
     38         }
     39         int pp=powmod(ji[i][i],mod-2);
     40         for (int j=i+1;j<=n;j++)
     41         {
     42             int now=1ll*ji[j][i]*pp%mod;
     43             for (int k=i;k<=n;k++) ji[j][k]-=1ll*ji[i][k]*now%mod,ji[j][k]+=ji[j][k]<0?mod:0;
     44         }
     45     }
     46     for (int i=1;i<=n;i++) ans=1ll*ans*ji[i][i]%mod;
     47     return ans;
     48 }
     49 
     50 void gauss(int n)
     51 {
     52     for (int i=1;i<=n;i++)
     53     {
     54         if (duo[i][i]==0) for (int j=i+1;j<=n;j++) if (duo[j][i])
     55         {
     56             for (int k=i;k<=n+1;k++) {int t=duo[i][k]; duo[i][k]=duo[j][k]; duo[j][k]=t;}
     57             break;
     58         }
     59         int pp=powmod(duo[i][i],mod-2);
     60         for (int j=i+1;j<=n;j++)
     61         {
     62             int now=1ll*duo[j][i]*pp%mod;
     63             for (int k=i;k<=n+1;k++) duo[j][k]-=1ll*duo[i][k]*now%mod,duo[j][k]+=duo[j][k]<0?mod:0;
     64         }
     65     }
     66     for (int i=n;i;i--)
     67     {
     68         for (int j=n;j>i;j--) duo[i][n+1]-=1ll*duo[i][j]*duo[j][n+1]%mod,duo[i][n+1]+=duo[i][n+1]<0?mod:0;
     69         duo[i][n+1]=1ll*duo[i][n+1]*powmod(duo[i][i],mod-2)%mod;
     70     }
     71 }
     72 
     73 int mp[maxn][maxn],du[maxn],base[maxn][maxn];
     74 int main()
     75 {
     76     scanf("%d",&n);
     77     for (int i=1,x,y;i<n;i++)
     78     {
     79         scanf("%d%d",&x,&y);
     80         mp[x][y]++; mp[y][x]++; du[x]++; du[y]++;
     81     }
     82     for (int i=1;i<=n;i++)
     83         for (int j=1;j<=n;j++)
     84         {
     85             if (i==j) base[i][j]=n-1;
     86             else base[i][j]=mod-1;
     87         }
     88     for (int i=0;i<n;i++)
     89     {
     90         memcpy(ji,base,sizeof(ji));
     91         for (int j=1;j<=n;j++) ji[j][j]+=du[j]*i;
     92         for (int j=1;j<=n;j++)
     93             for (int k=1;k<=n;k++)
     94                 if (j!=k && mp[j][k]) ji[j][k]-=i;
     95         duo[i+1][n+1]=hh(n-1);
     96         for (int j=1,tmp=1;j<=n;j++,tmp=1ll*tmp*(i+1)%mod) duo[i+1][j]=tmp;
     97     }
     98     gauss(n);
     99     for (int i=1;i<=n;i++) printf("%d ",duo[i][n+1]);
    100     return 0;
    101 }
    View Code
  • 相关阅读:
    http协议之状态码
    HTTP协议入门基础
    CI框架使用(一)
    memcache常见现象(一)雪崩现象
    memcached分布式一致性哈希算法
    编译php扩展
    memcached--delete--replace--set--get--incr--decr--stats
    memcached--add使用
    php5.3之命名空间
    MySQL优化(一)
  • 原文地址:https://www.cnblogs.com/Blue233333/p/8512438.html
Copyright © 2020-2023  润新知