题目大意

一张有 \(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. redhat更改yum源及安装PHP环境

    redhat更新yum源 删除同RHEL一同安装的yum源 rpm -qa|grep yum #查看本地yum yum list | wc -l #看个数 yum install pip #看现象 r ...

  2. 获取联系人列表的时候contact_id出现null的值

    因为删除联系人只是把它的contact_id设置为null,所以只要手机上删除过联系人id就会有null,用之前先判断是不是null就好了

  3. insert/delete/select/update 以及一些在select中常用的函数之类的

    crud程序员:create,read,update.delete 一.insert 细节说明: 1.插入的数据应与字段的数据类型相同.比如把'abc'添加到int类型会错误2.数据的长度应在列的规定 ...

  4. Linux忘记Root密码怎么找回

    进入1级别,单用户模式 ,修改root密码即可(运行级别不懂看这里) 具体操作如下: 1.开机时按enter键 2.进入GRUB界面 3.输入 e,在引导系统前编辑命令 4.选择第二行 kernel ...

  5. CentOS更新VMware Tools及设置共享文件夹

    CentOS设置共享文件夹 设置共享文件夹 点击虚拟机->设置 2. 打开虚拟机设置->选项->共享文件夹->总是启用->添加 3. 点击下一步创建主机路径并命名 4. ...

  6. 虫师Selenium2+Python_12、BDD框架之Lettuce入门

    http://www.cnblogs.com/fnng/p/3415609.html P293--简介: TDD(Test-Drivern-Development)测试驱动开发 ATDD(Accept ...

  7. [技术干货-算子使用] mindspore.scipy 入门使用指导

    1. MindSpore框架的SciPy模块 SciPy 是基于NumPy实现的科学计算库,主要用于数学.物理学.生物学等科学以及工程学领域.诸如高阶迭代,线性代数求解等都会需要用到SicPy.Sci ...

  8. opencv笔记--Active contours

    Active Contours 也称作 Snake,通过定义封闭区域曲线的能量函数,并使其最小化得到最终曲线. Active Contours 被用作物体边界精确定位上,opencv 给出了一个实现, ...

  9. x86架构中的外部中断结构-Part 1:中断控制器的演化

    本文主要讲解了x86体系架构从外部设备接受中断的过程,本文是系列文章的第一部分,试图回答以下问题: 什么是PIC以及它的用途是什么? 什么是APIC以及它的用途是什么?LAPIC和I/O APIC的目 ...

  10. Solution -「多校联训」行列式

    \(\mathcal{Description}\)   Link.   给定 \(x,\{d_i\}_{i=1}^n,\{p_i\}_{i=2}^n,\{b_i\}_{i=2}^n,\{c_i\}_{ ...