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 ...
随机推荐
- js读取txt文件并下载
//我在vue中测试, 可行, 这个只适用于google浏览器, ie需要xObject对象 // 下载txt if (/(txt)$/.test(name[1])) { var xhr = new ...
- bash_profile和bashsrc的区别
感谢大佬:http://unclealan.cn/index.php/system/128.html 描述 在类Linux或者MACOS系统中,家目录(用户目录)中我们会看到,.bash_profil ...
- js 计算中英文混合字符串长度
转载请注明来源:https://www.cnblogs.com/hookjc/ function isChinese(str) { var lst = /[u00-uFF]/; ...
- HDOJ 1249 三角形『平面分隔』
很水拉 为了记规律- - 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1249 分隔平面公式 下面是我自己查找的公式,没有推到过程,但可以给一些链 ...
- python内置模块之re模块
内容概要 re模块常用方法 findall search match re模块其他方法 split sub subn compile finditer findall 对无名分组优先展示 re实战之爬 ...
- mysql悬案 之 为什么用docker启动的mysql配置文件不生效
文章目录 故事前景 查看docker启动时挂载了哪些目录 使用相同镜像启动一个mysql 新建一个目录用来存放容器内的mysql配置文件 复制容器内的mysql配置文件到本地 查看mysql配置文件目 ...
- 初识面向对象(Day17-Day18)
人狗大战的游戏 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏,你就思考呀,人狗作战,那至少需要2个角色,一个是人, 一个是狗,且人和狗都有不同的技能,比如人拿棍 ...
- Mybatis动态开发
1.单表动态SQL之if 2.单表动态SQL之foreach 3.单表动态SQL之片段抽取 Sql 中可将重复的 sql 提取出来,使⽤时⽤ include 引⽤即可,最终达到 sql 重⽤的⽬的
- v-model的修饰符
.lazy 就是在用户输入时数据不会进行传输,在失去焦点后或者按回车,才会将数据将进行改变 .number 因为v-model所绑定的数据,都会默认转换为string类型,而.number就能将数据转 ...
- 从.net开发做到云原生运维(二)——.net core生态
1. 新的开始从.net 6.0开始 .net 6.0作为一个长期支持版,具有里程碑的意义.从.net5.0将.net framework和.net core合并以后,在.net5.0的功能上再次完善 ...