CF917D题解
题目大意
一张有 \(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题解的更多相关文章
- 题解 CF917D 【Stranger Trees】
生成树计数问题用矩阵树定理来考虑. 矩阵树定理求得的为\(\sum\limits_T\prod\limits_{e\in T}v_e\),也就是所有生成树的边权积的和. 这题边是不带权的,应用矩阵树定 ...
- 【CF917D】Stranger Trees 树形DP+Prufer序列
[CF917D]Stranger Trees 题意:给你一棵n个点的树,对于k=1...n,问你有多少有标号的n个点的树,与给出的树有恰好k条边相同? $n\le 100$ 题解:我们先考虑容斥,求出 ...
- CF917D. Stranger Trees & TopCoder13369. TreeDistance(变元矩阵树定理+高斯消元)
题目链接 CF917D:https://codeforces.com/problemset/problem/917/D TopCoder13369:https://community.topcoder ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
随机推荐
- War包是什么??
感谢大佬: https://blog.csdn.net/Stitch__/article/details/88091745 https://www.jianshu.com/p/3b5c45e8e5bd ...
- js图片预览代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- copy与内存管理
1.copy与内存管理 浅拷贝 原对象引用计数器+1 必须对原对象进行释放 char *cstr = "this is a c string"; NSString *str1 = ...
- OC和C对比
1.源文件对比 C语言中常见源文件.h头文件,.c文件 文件扩展名 源类型 .h 头文件,用于存放函数声明 .c C语言源文件,用于实现头文件中声明的方法 OC中的源文件.h头文件,.m与.mm的实现 ...
- fiddler模拟2
在解决日常的支持需求中,经常会遇到一些用户反馈一些无法简单复现的bug,有很大一部分的bug是由于用户自身的网络环境波动,或者是本身网络环境就较为恶劣,而服务在面对这种恶劣的网络环境的健壮性不够,导致 ...
- Pytorch技法:继承Subset类完成自定义数据拆分
我们在<torch.utils.data.DataLoader与迭代器转换>中介绍了如何使用Pytorch内置的数据集进行论文实现,如torchvision.datasets.下面是加载内 ...
- MXNet学习:试用卷积-训练CIFAR-10数据集
第一次用卷积,看的别人的模型跑的CIFAR-10,不过吐槽一下...我觉着我的965m加速之后比我的cpu算起来没快多少..正确率64%的样子,没达到模型里说的75%,不知道问题出在哪里 import ...
- 书写高质量sql的一些建议
It's better to light a candle than to curse the darkness 老生常谈的不要使用select * 如果硬要使用select *,那么就请忍受一下以下 ...
- suse 12 二进制部署 Kubernetets 1.19.7 - 第03章 - 部署flannel插件
文章目录 1.3.部署flannel网络 1.3.0.下载flannel二进制文件 1.3.1.创建flannel证书和私钥 1.3.2.生成flannel证书和私钥 1.3.3.将pod网段写入et ...
- python的format
python的format 就是一个参数传递+格式化的过程 参数传递 1.位置传递,默认 fmt = "{} {}" fmt.format("hello",&q ...