题目大意

一张有 \(n\) 个节点的完全图,再给出这张图的一棵生成树,问该图有多少颗生成树和这颗生成树的公共边总共有 \(k\) 条,求助 \(0 \leq k \leq n-1\) 时所有 \(k\) 的答案。

做法

首先我们知道矩阵树定理求的是 所有生成树的边权之积的和。

那么我们设树边的边权为 \(x\),非树边的边权为 \(1\),若一棵生成树和该树有 \(k\) 条公共边,则该生成树的边权之积为 \(x^k\)。

求和之后的 \(k\) 次项就是答案了。

但是每一次行变换我们需要做 \(1\) 次乘法和 \(n\) 次减法,复杂度虽然是 \(O(n^4\log n)\) 的,但是如此大的常数即使是 CF 的机子也会 T。。。

我们换个思路,FFT 的运算过程就是 带入+差值,那我们把这个过程提到外面来做不就好了?

答案一定是一个 \(n-1\) 次多项式,根据代数基本定理,我们只需要 \(n\) 个点值就能把它插出来。

我们枚举 \(x\) 从 \(1\) 到 \(n\),对于每一个 \(x\) 跑一次矩阵树,复杂度 \(O(n^4)\)。

最后我们可以 \(O(n)\) 拉格朗日差值,也可以 \(O(n^3)\) 高斯消元,我写的是高斯消元,因为最近刷矩阵树逐渐熟悉了高斯消元(

code:

const int M=105,mod=1e9+7;
int n,u[M],v[M],x[M];
int G[M][M],Matrix[M][M];
inline int Add(const int&a,const int&b){
return a+b>=mod?a+b-mod:a+b;
}
inline int Del(const int&a,const int&b){
return a-b<0?a-b+mod:a-b;
}
inline int pow(int a,int b=mod-2){
int ans=1;
for(;b;b>>=1,a=1ll*a*a%mod)if(b&1)ans=1ll*ans*a%mod;
return ans;
}
inline int Matrix_Tree(){
register int i,j,k,d,inv,ans=1;
for(i=2;i<=n;++i){
inv=pow(Matrix[i][i]);
for(j=i+1;j<=n;++j){
d=1ll*Matrix[j][i]*inv%mod;
for(k=i;k<=n;++k)Matrix[j][k]=Del(Matrix[j][k],1ll*d*Matrix[i][k]%mod);
}
ans=1ll*ans*Matrix[i][i]%mod;
}
return ans;
}
inline void Gauss(){
register int i,j,k,d,inv;
for(i=1;i<=n;++i){
inv=pow(G[i][i]);
for(j=1;j<=n;++j){
if(i==j)continue;
d=1ll*G[j][i]*inv%mod;
for(k=i;k<=n+1;++k)G[j][k]=Del(G[j][k],1ll*d*G[i][k]%mod);
}
}
}
signed main(){
register int i,j,k,X;
scanf("%d",&n);
for(i=1;i<=n;++i){
for(j=1;j<=n;++j){
if(i==j)G[i][j]=n-1;
else G[i][j]=mod-1;
}
}
for(i=1;i<n;++i)scanf("%d%d",u+i,v+i);
for(i=1;i<=n;++i){
for(j=1;j<=n;++j){
for(k=1;k<=n;++k){
Matrix[j][k]=G[j][k];
}
}
x[i]=i;G[i][n+1]=Matrix_Tree();
for(j=1;j<n;++j){
++G[u[j]][u[j]];++G[v[j]][v[j]];
--G[u[j]][v[j]];--G[v[j]][u[j]];
}
}
for(i=1;i<=n;++i){
G[i][1]=1;X=x[i];
for(j=2;j<=n;++j){
G[i][j]=X;X=1ll*X*x[i]%mod;
}
}
Gauss();
for(i=1;i<=n;++i)printf("%d ",1ll*G[i][n+1]*pow(G[i][i])%mod);
}

CF917D题解的更多相关文章

  1. 题解 CF917D 【Stranger Trees】

    生成树计数问题用矩阵树定理来考虑. 矩阵树定理求得的为\(\sum\limits_T\prod\limits_{e\in T}v_e\),也就是所有生成树的边权积的和. 这题边是不带权的,应用矩阵树定 ...

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

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

  3. CF917D. Stranger Trees & TopCoder13369. TreeDistance(变元矩阵树定理+高斯消元)

    题目链接 CF917D:https://codeforces.com/problemset/problem/917/D TopCoder13369:https://community.topcoder ...

  4. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  5. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  6. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  7. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  8. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  9. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

随机推荐

  1. Python property动态属性

    from datetime import datetime, date class User: def __init__(self, name, birthday): self.name = name ...

  2. drop、delete和truncate三者的区别

    相同点:1.truncate和不带where子句的delete.以及drop都会删除表内的数据.2.drop.truncate都是DDL语句(数据定义语言),执行后会自动提交.不同点:1. trunc ...

  3. pytest(6)-Fixture(固件)

    什么是固件 Fixture 翻译成中文即是固件的意思.它其实就是一些函数,会在执行测试方法/测试函数之前(或之后)加载运行它们,常见的如接口用例在请求接口前数据库的初始连接,和请求之后关闭数据库的操作 ...

  4. 7、Linux基础--权限、查看用户信息

    笔记 1.晨考 1.Linux系统中的文件"身份证号"是什么 index node 号码 2.什么是硬链接,什么是软连接 硬链接是文件的入口,软连接是快捷方式. 3.硬链接中保存的 ...

  5. Solution -「LOCAL」舟游

    \(\mathcal{Description}\)   \(n\) 中卡牌,每种三张.对于一次 \(m\) 连抽,前 \(m-1\) 次抽到第 \(i\) 种的概率是 \(p_i\),第 \(m\) ...

  6. shell脚本之判断当前内核主版本是否为3,且次版本是否大于10

    [root@localhost ~]# cat uname.sh #!/bin/bash main=`uname -r | awk -F . '{print $1}'` minor=`uname -r ...

  7. SpringBoot是如何做到自动装配的

    背景 众所周知,如下即可启动一个最简单的Spring应用.查看@SpringBootApplication注解的源码,发现这个注解上有一个重要的注解@EnableAutoConfiguration,而 ...

  8. Redis 学习-上

    一.Redis 概述 1.1.Redis 定义 Redis (Remote Dictionary Server):远程字典服务 是一个开源的使用 ANSI C 语言编写.支持网络.可基于内存亦可持久化 ...

  9. 01_描述对象_类图(Class Diagram)

    1.   作用 用于面向对象软件开发的分析和设计阶段,描述系统的静态结构. 描述类与类.类与接口.接口与接口之间的静态结构和关系,描述系统的结构化设计.最基本的元素:类.接口. 用于应用程序的一般概念 ...

  10. Ubuntu更新命令无法执行的,下一步该怎么办?

    对Linux的系统学习的更加深入,所以今天笔者正在Ubuntu20.04 LTS 上部署Sublime Text 的环境时 , 由于对操作的不熟悉,踩了一些坑.拿出来和大家分享. 正在我对照着官方文档 ...