题目

看题解的时候才突然发现\(zky\)讲过这道题啊,我现在怕不是一个老年人了

众所周知矩阵树求得是这个

\[\sum_{T}\prod_{e\in T}w_e
\]

而我们现在的这个问题有些鬼畜了,给定一棵树,求和这棵树有\(k\)条公共边的生成树个数

我们如何区分出和原生成树有几条边呢,容斥显然不是很可做,于是之后就不会啦

看了题解发现这是神仙题,引用潮子名言我可能这辈子是做不出来了

对于不在给定生成树里的边\(w_e\)我们设\(w_e=1\),对于在生成树里的边我们将其设成\(w_e=x\),没错就是\(x\),就是一个多项式

这样矩阵树得到的结果必然也是一个多项式,其中\(k\)次项系数就对应了和原树有\(k\)条公共边的方案数

如果模数是\(NTT\)模数那么我们直接矩阵树套多项式就好啦,但是\(O(n^4logn)\)的复杂度显然不科学啊

考虑一些其他求多项式系数的方法,暴力一点也行

于是我们可以高斯消元

这个多项式是一个\(n-1\)的多项式,于是我们可以直接给\(x\)找\(n\)种取值,之后得到\(n\)个方程,之后高斯消元就可以求出系数来了

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define re register
#define LL long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
const int maxn=105;
const int mod=1e9+7;
inline int read() {
char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
int n,x[maxn],y[maxn],ans[maxn];
int a[maxn][maxn],b[maxn][maxn];
inline int ksm(int a,int b) {
int S=1;
while(b) {if(b&1) S=(1ll*S*a)%mod;b>>=1;a=(1ll*a*a)%mod;}
return S;
}
inline void reBuild() {
for(re int i=1;i<=n;i++) a[i][i]=n-1;
for(re int i=1;i<=n;i++)
for(re int j=1;j<=n;j++) {
if(i==j) continue;
a[i][j]=mod-1;
}
}
inline int solve(int t) {
reBuild();
for(re int i=1;i<n;i++) {
int u=x[i],v=y[i];
a[u][u]--,a[v][v]--;
a[u][u]+=t,a[v][v]+=t;
a[u][v]=a[v][u]=mod-t;
}
int o=0;
for(re int i=1;i<n;i++) {
int p;
for(p=i;p<n;++p) if(a[p][i]) break;
if(p!=i) std::swap(a[p],a[i]),o^=1;
int Inv=ksm(a[i][i],mod-2);
for(re int j=i+1;j<n;j++) {
int mul=(1ll*a[j][i]*Inv)%mod;
for(re int k=i;k<n;k++)
a[j][k]=(a[j][k]-1ll*a[i][k]*mul%mod+mod)%mod;
}
}
int now=1;
for(re int i=1;i<n;i++) now=(1ll*now*a[i][i])%mod;
return o?(mod-now)%mod:now;
}
int main() {
n=read();
for(re int i=1;i<n;i++) x[i]=read(),y[i]=read();
for(re int i=0;i<n;i++) {
b[i][n]=solve(i+1);
b[i][0]=1;
for(re int j=1;j<n;j++) b[i][j]=ksm(i+1,j);
}
for(re int i=0;i<n;i++) {
int p;
for(p=i;p<n;++p) if(b[p][i]) break;
if(p!=i) std::swap(b[p],b[i]);
int Inv=ksm(b[i][i],mod-2);
for(re int j=n;j>=i;--j) b[i][j]=(1ll*b[i][j]*Inv)%mod;
for(re int j=i+1;j<n;j++)
for(re int k=n;k>=i;--k)
b[j][k]=(b[j][k]-1ll*b[j][i]*b[i][k]%mod+mod)%mod;
}
ans[n-1]=b[n-1][n];
for(re int i=n-2;i>=0;--i) {
ans[i]=b[i][n];
for(re int j=n-1;j>i;--j)
ans[i]=(ans[i]-1ll*ans[j]*b[i][j]%mod+mod)%mod;
}
for(re int i=0;i<n;i++) printf("%d ",ans[i]);
return 0;
}

【CF917D】Stranger Trees的更多相关文章

  1. 【CF917D】Stranger Trees 树形DP+Prufer序列

    [CF917D]Stranger Trees 题意:给你一棵n个点的树,对于k=1...n,问你有多少有标号的n个点的树,与给出的树有恰好k条边相同? $n\le 100$ 题解:我们先考虑容斥,求出 ...

  2. 【AGC018F】Two Trees 构造 黑白染色

    题目描述 有两棵有根树,顶点的编号都是\(1\)~\(n\). 你要给每个点一个权值\(a_i\),使得对于两棵树的所有顶点\(x\),满足\(|x\)的子树的权值和\(|=1\) \(n\leq 1 ...

  3. 【CF711C】Coloring Trees(DP)

    题意:给你n个数字,一共有m种,如果某数为0则该数为空,空的地方可以填任意种类数,但每填一个数字都要花费一定的费用, 从头到尾,所有相邻且相同的数字看作一个集合,求使n个数字的集合数为k所需的最小费用 ...

  4. 【LeetCode】树(共94题)

    [94]Binary Tree Inorder Traversal [95]Unique Binary Search Trees II (2018年11月14日,算法群) 给了一个 n,返回结点是 1 ...

  5. 【LeetCode】深搜DFS(共85题)

    [98]Validate Binary Search Tree [99]Recover Binary Search Tree [100]Same Tree [101]Symmetric Tree [1 ...

  6. 【HDU4010】【LCT】Query on The Trees

    Problem Description We have met so many problems on the tree, so today we will have a query problem ...

  7. 【计算几何初步-凸包-Jarvis步进法。】【HDU1392】Surround the Trees

    [科普]什么是BestCoder?如何参加? Surround the Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65 ...

  8. CF917D Stranger Trees

    CF917D Stranger Trees 题目描述 给定一个树,对于每个\(k=0,1\cdots n-1\),问有多少个生成树与给定树有\(k\)条边重合. 矩阵树定理+高斯消元 我们答案为\(f ...

  9. 【HDU1693】Eat the Trees(插头dp)

    [HDU1693]Eat the Trees(插头dp) 题面 HDU Vjudge 大概就是网格图上有些点不能走,现在要找到若干条不相交的哈密顿回路使得所有格子都恰好被走过一遍. 题解 这题的弱化版 ...

随机推荐

  1. Java基础-内部类介绍

    java内部类介绍 内部类一共分为4种 成员内部类 静态内部类 方法内部类 匿名内部类 下面我会为大家详细介绍每一个内部类!! 成员内部类 成员内部类就好像是外部类的一个成员属性,也是内部类中最常见的 ...

  2. 概述Java集合框架

    JAVA集合框架主要分为三个部分:接口,实现和算法.接口是指以Collection和Map为起始的一系列公用接口,其中还有Vector接口,也就是迭代器,Collection接口下面又有List 和S ...

  3. Nginx面试

    声明:此文章非本人所 原创,是别人分享所得,如有知道原作者是谁可以联系本人,如有转载请加上此段话 1.请解释一下什么是 Nginx? Nginx是一个 web服务器和反向代理服务器,用于 HTTP.H ...

  4. Ubuntu双系统环境下隐藏掉其他开机启动项

    系统环境:ubuntu16.04需求:PC装的双系统(ubuntu+win10),为了应对某些需求,需要将win10系统给从电脑上消失,让你看不见也进不去它.做法:当然不可能真的删除掉win10系统, ...

  5. BZOJ1396: 识别子串(后缀自动机 线段树)

    题意 题目链接 Sol 后缀自动机+线段树 还是考虑通过每个前缀的后缀更新答案,首先出现次数只有一次,说明只有\(right\)集合大小为\(1\)的状态能对答案产生影响 设其结束位置为\(t\),代 ...

  6. mybatis作用、基本使用、小结

    1. MyBatis 1.1. 作用 MyBatis是持久层框架,它是支持JDBC的!简化了持久层开发! 使用MyBatis时,只需要通过接口指定数据操作的抽象方法,然后配置与之关联的SQL语句,即可 ...

  7. php5.5过渡--变量

    单纯的定义变量,如: $usernumber = $_POST['usernumber']; 会出现警告: Notice: Undefined index: usernumber in ... 规范问 ...

  8. 转:Jquery如何获取某个元素前(后)的文本内容?

    原文:[解决]Jquery如何获取某个元素前(后)的文本内容? <span> text here... <a id="target_element">百万创 ...

  9. Android开发问题积累 <加载在线Gif><WebView无法加载网页图片>

    在线Gif加载 解决办法 Glide完美解决 Glide.with(context).load(pic).placeholder(R.drawable.loading).into(imageView) ...

  10. Flutter自定义标题栏之处理状态栏高度

    App在很多情况下由于各种需求需要自定义标题栏,而在能够构建Android和IOS应用的Flutter中,如果不在Scaffold中使用AppBar会发现默认是沉浸式. 猜想:我们使用自定义标题栏好像 ...