CF917D-Stranger Trees【矩阵树定理,高斯消元】
正题
题目链接:https://www.luogu.com.cn/problem/CF917D
题目大意
给出\(n\)个点的一棵树,对于每个\(k\)求有多少个\(n\)个点的树满足与给出的树恰好有\(k\)条边重合。
解题思路
矩阵树有一个统计所有树边权和的和用法,就是把变量变成一个形如\(wx+1\)的多项式,这样一次项系数的值就表示了固定选择一条边的\(w\)时其他边的方案数之和。
这题我们可以同理,对于在给出数上的边是\(x\),而其他就是\(1\)。那么最后询问\(x^k\)的系数就是答案了。
如果暴力套\(\text{NTT}\)不仅麻烦,而且跑的很慢过不了本题,考虑另一种求系数的方法。
我们假设答案是一个形如\(F(x)=\sum_{i=0}^{n-1}a_ix^i\)的\(n\)次项式,那么我们如果把\(n\)个\(x\)的值直接带入求出\(F\),然后用待定系数法的话我们就可以列出\(n\)个方程从而解出这个\(n\)项式的每一个系数。
时间复杂度\(O(n^4)\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=110,P=1e9+7;
ll n,x[N],y[N];
ll power(ll x,ll b){
ll ans=1;
while(b){
if(b&1)ans=ans*x%P;
x=x*x%P;b>>=1;
}
return ans;
}
namespace Guass{
ll a[N][N],b[N];
void solve(){
for(ll i=1;i<=n;i++){
ll z=i;
for(ll j=i;j<=n;j++)
if(a[j][i]){z=j;break;}
swap(a[i],a[z]);swap(b[i],b[z]);
ll inv=power(a[i][i],P-2);
for(ll j=i;j<=n;j++)
a[i][j]=a[i][j]*inv%P;
b[i]=b[i]*inv%P;
for(ll j=i+1;j<=n;j++){
ll rate=P-a[j][i];
for(ll k=i;k<=n;k++)
(a[j][k]+=rate*a[i][k]%P)%=P;
(b[j]+=rate*b[i]%P)%=P;
}
}
for(ll i=n;i>=1;i--){
for(ll j=i+1;j<=n;j++)
(b[i]+=P-b[j]*a[i][j]%P)%=P;
}
return;
}
}
namespace Matrix{
ll a[N][N];
ll det(){
ll f=1,ans=1;
for(ll i=1;i<n;i++){
ll z=i;
for(ll j=i;j<n;j++)
if(a[j][i]){
if(j!=i)f=-f;
z=j; break;
}
swap(a[i],a[z]);
ll inv=power(a[i][i],P-2);
ans=ans*a[i][i]%P;
for(ll j=i;j<n;j++)
a[i][j]=a[i][j]*inv%P;
for(ll j=i+1;j<n;j++){
ll rate=P-a[j][i];
for(ll k=i;k<n;k++)
(a[j][k]+=rate*a[i][k]%P)%=P;
}
}
return ans*f;
}
void solve(ll w){
for(ll i=1;i<=n;i++)
for(ll j=1;j<=n;j++)
a[i][j]=P-1;
for(ll i=1;i<=n;i++)a[i][i]=n-1;
for(ll i=1;i<n;i++){
a[x[i]][x[i]]+=w-1;
a[y[i]][y[i]]+=w-1;
a[x[i]][y[i]]=P-w;
a[y[i]][x[i]]=P-w;
}
Guass::b[w]=det();
for(ll i=1,p=1;i<=n;i++,p=p*w%P)
Guass::a[w][i]=p;
return;
}
}
signed main(){
scanf("%lld",&n);
for(ll i=1;i<n;i++)
scanf("%lld%lld",&x[i],&y[i]);
for(ll i=1;i<=n;i++)Matrix::solve(i);
Guass::solve();
for(ll i=1;i<=n;i++)
printf("%lld ",Guass::b[i]);
return 0;
}
CF917D-Stranger Trees【矩阵树定理,高斯消元】的更多相关文章
- [CF917D]Stranger Trees[矩阵树定理+解线性方程组]
题意 给你 \(n\) 个点的无向完全图,指定一棵树 \(S\),问有多少棵生成树和这棵树的公共边数量为 \(k\in[0,n-1]\) \(n\leq 100\) 分析 考虑矩阵树定理,把对应的树边 ...
- [spoj104][Highways] (生成树计数+矩阵树定理+高斯消元)
In some countries building highways takes a lot of time... Maybe that's because there are many possi ...
- BZOJ4031 [HEOI2015]小Z的房间 【矩阵树定理 + 高斯消元】
题目链接 BZOJ4031 题解 第一眼:这不裸的矩阵树定理么 第二眼:这个模\(10^9\)是什么鬼嘛QAQ 想尝试递归求行列式,发现这是\(O(n!)\)的.. 想上高斯消元,却又处理不了逆元这个 ...
- P3317 [SDOI2014]重建 变元矩阵树定理 高斯消元
传送门:https://www.luogu.org/problemnew/show/P3317 这道题的推导公式还是比较好理解的,但是由于这个矩阵是小数的,要注意高斯消元方法的使用: #include ...
- 洛谷4208 JSOI2008最小生成树计数(矩阵树定理+高斯消元)
qwq 这个题目真的是很好的一个题啊 qwq 其实一开始想这个题,肯定是无从下手. 首先,我们会发现,对于无向图的一个最小生成树来说,只有当存在一些边与内部的某些边权值相同的时候且能等效替代的时候,才 ...
- Wannafly Camp 2020 Day 1D 生成树 - 矩阵树定理,高斯消元
给出两幅 \(n(\leq 400)\) 个点的无向图 \(G_1 ,G_2\),对于 \(G_1\) 的每一颗生成树,它的权值定义为有多少条边在 \(G_2\) 中出现.求 \(G_1\) 所有生成 ...
- 【BZOJ3534】【Luogu P3317】 [SDOI2014]重建 变元矩阵树,高斯消元
题解看这里,主要想说一下以前没见过的变元矩阵树还有前几个题见到的几个小细节. 邻接矩阵是可以带权值的.求所有生成树边权和的时候我们有一个基尔霍夫矩阵,是度数矩阵减去邻接矩阵.而所谓变元矩阵树实际上就是 ...
- SP104 Highways (矩阵树,高斯消元)
矩阵树定理裸题 //#include <iostream> #include <cstdio> #include <cstring> #include <al ...
- SPOJ HIGH Highways ——Matrix-Tree定理 高斯消元
[题目分析] Matrix-Tree定理+高斯消元 求矩阵行列式的值,就可以得到生成树的个数. 至于证明,可以去看Vflea King(炸树狂魔)的博客 [代码] #include <cmath ...
随机推荐
- Windows莫名内存到百分之百,需要修改虚拟内存
借鉴别人的操作: https://blog.csdn.net/xjpdf10/article/details/82849112
- Spring-Boot的动态代理AOP原理
前言 Spring AOP使用了动态代理技术,动态代理在业界比较流行的实现方式有,CGLIB,Javassist,ASM等等. Spring动态代理实现方式 Spring采用了JDK和CGLIB两种方 ...
- 从零开始实现简单 RPC 框架 5:网络通信之序列化
我们在接下来会开始讲网络通信相关的内容了.既然是网络通信,那必然会涉及到序列化的相关技术. 下面是 ccx-rpc 序列化器的接口定义. /** * 序列化器 */ public interface ...
- WPF原理剖析——路由事件
一.路由事件与传统事件传统事件的触发者和处理者是紧密相连的,而路由事件则不是,路由事件允许一个元素的事件有另外的元素触发.也即就是说路由事件的拥有者和响应者之间没有显示的订阅关系.事件的拥有者只负责激 ...
- Spring详解(九)------事务管理
1.事务介绍 事务(Transaction),一般是指要做的或所做的事情.在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit). 这里我们以取钱的例子来讲解:比如你去ATM ...
- 如何在 Go 中嵌入 Python
如果你看一下 新的 Datadog Agent,你可能会注意到大部分代码库是用 Go 编写的,尽管我们用来收集指标的检查仍然是用 Python 编写的.这大概是因为 Datadog Agent 是一个 ...
- springboot静态资源路径制定
spring.resources.static-location参数指定了Spring Boot-web项目中静态文件存放地址, 该参数默认设置为: classpath:/static, classp ...
- Redis-技术专区-帮从底层彻底吃透RDB技术原理
每日一句 低头是一种能力,它不是自卑,也不是怯弱,它是清醒中的嬗变.有时,稍微低一下头,或者我们的人生路会更精彩. 前提概要 Redis是一个的键-值(K-V)对的内存数据库服务,通常包含了任意个非空 ...
- 【良心保姆级教程】java手把手教你用swing写一个学生的增删改查模块
很多刚入门的同学,不清楚如何用java.swing去开发出一个系统? 不清楚如何使用java代码去操作数据库进行增删改查一些列操作,不清楚java代码和数据库(mysql.sqlserver)之间怎么 ...
- 20210720 noip21
又是原题,写下题解吧 Median 首先时限有 2s(学校评测机太烂,加到 4s 了),可以放心地筛 \(1e7\) 个质数并算出 \(s_2\),然后问题变为类似滑动求中位数.发现 \(s_2\) ...