【CF917D】Stranger Trees
看题解的时候才突然发现\(zky\)讲过这道题啊,我现在怕不是一个老年人了
众所周知矩阵树求得是这个
\]
而我们现在的这个问题有些鬼畜了,给定一棵树,求和这棵树有\(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的更多相关文章
- 【CF917D】Stranger Trees 树形DP+Prufer序列
[CF917D]Stranger Trees 题意:给你一棵n个点的树,对于k=1...n,问你有多少有标号的n个点的树,与给出的树有恰好k条边相同? $n\le 100$ 题解:我们先考虑容斥,求出 ...
- 【AGC018F】Two Trees 构造 黑白染色
题目描述 有两棵有根树,顶点的编号都是\(1\)~\(n\). 你要给每个点一个权值\(a_i\),使得对于两棵树的所有顶点\(x\),满足\(|x\)的子树的权值和\(|=1\) \(n\leq 1 ...
- 【CF711C】Coloring Trees(DP)
题意:给你n个数字,一共有m种,如果某数为0则该数为空,空的地方可以填任意种类数,但每填一个数字都要花费一定的费用, 从头到尾,所有相邻且相同的数字看作一个集合,求使n个数字的集合数为k所需的最小费用 ...
- 【LeetCode】树(共94题)
[94]Binary Tree Inorder Traversal [95]Unique Binary Search Trees II (2018年11月14日,算法群) 给了一个 n,返回结点是 1 ...
- 【LeetCode】深搜DFS(共85题)
[98]Validate Binary Search Tree [99]Recover Binary Search Tree [100]Same Tree [101]Symmetric Tree [1 ...
- 【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 ...
- 【计算几何初步-凸包-Jarvis步进法。】【HDU1392】Surround the Trees
[科普]什么是BestCoder?如何参加? Surround the Trees Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65 ...
- CF917D Stranger Trees
CF917D Stranger Trees 题目描述 给定一个树,对于每个\(k=0,1\cdots n-1\),问有多少个生成树与给定树有\(k\)条边重合. 矩阵树定理+高斯消元 我们答案为\(f ...
- 【HDU1693】Eat the Trees(插头dp)
[HDU1693]Eat the Trees(插头dp) 题面 HDU Vjudge 大概就是网格图上有些点不能走,现在要找到若干条不相交的哈密顿回路使得所有格子都恰好被走过一遍. 题解 这题的弱化版 ...
随机推荐
- 【转】JS前台加密,java后台解密实现
因项目需求,需要一些敏感信息进行加密,不能以明文暴露到浏览器. 然后后台进行解密操作 先看一下效果图 未对其加密传输 1.前台JS <script type="text/javascr ...
- 从 Hadoop 1.0 到 Hadoop 2.0 ,你需要了解这些
学习大数据,刚开始接触的是 Hadoop 1.0,然后过度到 Hadoop 2.0 ,这里为了书写方便,本文中 Hadoop 1.0 采用 HV1 的缩写方式,Hadoop 2.0 采用 HV2 的缩 ...
- Java Web中涉及的编解码
用户从浏览器发起一个HTTP请求,存在编码的地方是URL.Cookie.Paramiter.服务器端接收到HTTP请求后要解析HTTP协议,其中URL.Cookie和POST表单参数要解码,服务器端可 ...
- Asp.net MVC流程简述
先上个图 步骤一 IIS 当请求到达我们的服务器时,在asp.net取得控制之前,windows操作系统的核心组件 HTTP.SYS一直在监听请求端口, 接下来asp.net会通知所有注册的ht ...
- C#设计模式--代理模式(学习Learning hard 设计模式笔记)
class Program { static void Main(string[] args) { //创建一个代理对象 并发出请求 Person proxy = new Friend(); prox ...
- SQL Server 2017搭建主从备份
SQL Server 2017搭建主从¶ 关于日志传输¶ 和Oracle DG,Mysql主从一样,SQL Server也支持主从的高可用.进一步提高数据的安全性和业务的高可用.通过将主库上的日志传输 ...
- 关于j使用ava匿名类的好处总结
匿名类,除了只能使用一次,其实还有其他用处,比如你想使用一个类的protected方法时,但是又和这个类不在同一个包下,这个时候匿名类就派上用场了,你可以定义一个匿名类继承这个类,在这个匿名类中定义一 ...
- 180415_判断闰年的思路及三种 java 实现
世纪年:能整除 100 的年份 普通年:不能整除 100 的年份 闰年:一年有 366 天,二月有 29 天 平年:一年有 365 天,二月有 28 天 对于世纪年:能整除 400 为闰年,否则为平年 ...
- Storm默认配置 default.yaml
default.yaml文件所在位置:apache-storm-0.9.4.tar.gz/apache-storm-0.9.4/lib/storm-core-0.94.jar/default.yaml ...
- 软工读书笔记 week 9 ——《构建之法》
软工读书笔记 week 9 ——<构建之法> 最近的三周我们正式开始我们的项目.然后我也把<构建之法>中的相关章节再拿出来读了一番.以下是一些 ...