CF917D Stranger Trees【矩阵树定理,高斯消元】
题目链接:洛谷
题目大意:给定一个$n$个节点的树$T$,令$ans_k=\sum_{T'}[|T\cap T'|=k]$,即有$k$条边重合。输出$ans_0,ans_1,\ldots,ans_{n-1}$.
数据范围:$1\leq n\leq 100$
这题的思路挺巧妙的,非常不错。
我们将$T$上的边的边权作为$x$,不在$T$上的边的边权设为$1$(一个完全图),然后用矩阵树定理算出所有生成树的边权之积之和,也就是$x^k$的系数就是$ans_k$,现在我们要求这个多项式。
但是运算一个多项式的行列式复杂度会高到爆炸,所以我们考虑插值,只需要$n$个点值就可以,这里我们取$x=1,2,\ldots n$,然后用高斯消元算出这个多项式的系数就可以。(具体实现看代码)
时间复杂度$O(n^4)$。
#include<bits/stdc++.h>
#define Rint register int
using namespace std;
typedef long long LL;
const int N = , mod = 1e9 + ;
int n, a[N][N], b[N][N];
bool tree[N][N];
inline int kasumi(int a, int b){
int res = ;
while(b){
if(b & ) res = (LL) res * a % mod;
a = (LL) a * a % mod;
b >>= ;
}
return res;
}
inline int Gauss(){
int res = ;
for(Rint i = ;i < n;i ++){
for(Rint j = i + ;j < n;j ++)
while(a[j][i]){
int d = a[i][i] / a[j][i];
for(Rint k = i;k < n;k ++)
a[i][k] = (a[i][k] - (LL) d * a[j][k] + mod) % mod;
swap(a[i], a[j]);
res = mod - res;
}
res = (LL) res * a[i][i] % mod;
if(!a[i][i]) return ;
}
return res;
}
int main(){
scanf("%d", &n);
for(Rint i = ;i < n;i ++){
int a, b;
scanf("%d%d", &a, &b);
tree[a][b] = tree[b][a] = true;
}
for(Rint k = ;k <= n;k ++){
for(Rint i = ;i <= n;i ++){
a[i][i] = ;
for(Rint j = ;j <= n;j ++){
if(i != j){
if(tree[i][j]){
a[i][j] = mod - k;
a[i][i] = (a[i][i] + k) % mod;
} else {
a[i][j] = mod - ;
a[i][i] = (a[i][i] + ) % mod;
}
}
}
}
b[k][] = ;
for(Rint i = ;i <= n;i ++) b[k][i] = (LL) b[k][i - ] * k % mod;
b[k][n + ] = Gauss();
}
for(Rint i = ;i <= n;i ++){
int inv = kasumi(b[i][i], mod - );
for(Rint j = i + ;j <= n + ;j ++)
b[i][j] = (LL) b[i][j] * inv % mod;
for(Rint j = ;j <= n;j ++)
if(i != j)
for(Rint k = i + ;k <= n + ;k ++)
b[j][k] = (b[j][k] - (LL) b[j][i] * b[i][k] % mod + mod) % mod;
}
for(Rint i = ;i <= n;i ++) printf("%d ", b[i][n + ]);
}
CF917D
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 ...
- CF917D-Stranger Trees【矩阵树定理,高斯消元】
正题 题目链接:https://www.luogu.com.cn/problem/CF917D 题目大意 给出\(n\)个点的一棵树,对于每个\(k\)求有多少个\(n\)个点的树满足与给出的树恰好有 ...
- 洛谷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 ...
随机推荐
- Go part 3 指针,栈与堆
指针类型 要明白指针,需要知道几个概念:指针地址,指针类型 和 指针取值 取指针地址 每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置,使用 & 放在变量前面进行“取指针地址”操 ...
- vue 钩子函数的初接触
vue-router的路由钩子函数: 第一种:全局钩子函数. router.beforeEach((to, from, next) => { console.log('beforeEach') ...
- 如何解决js地址栏中传递中文乱码的问题
目标要求: 实现从A页面跳转至B页面,B页面接收A页面通过地址栏传递过来的中文参数,中文不能出现乱码. A页面部分代码(传递参数): var title = "这是中文"; var ...
- Java 面向对象(三)static 关键字
一.static 1.概述 static 的意思的静态的,也是一种修饰符. 关于 static 关键字的使用,它可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单属于某个对象的. 用 ...
- spring-security配置和原理简介
SpringSecurity3的核心类有三种 1.URL过滤器或方法拦截器:用来拦截URL或者方法资源对其进行验证,其抽象基类为AbstractSecurityInterceptor 2.资源权限获取 ...
- 使用MySQL审计Plugin
本文来源:http://blog.chinaunix.net/uid-20785090-id-5018977.html 越来越多的企业把应用往mysql上迁移,这时候对数据库的审计又成了一件紧急的事情 ...
- 详解分布式系统里session同步
1.什么是session?什么又是cookie?他俩有啥联系和区别? 2.为什么要在多台服务器间进行session的共享同步? 3.以及有哪些方法来实现这个同步? 大家快搬板凳,老王开始扯淡咯~ 1. ...
- OpenGL ES on iOS --- 统一变量(Uniform)和统一变量块(UBO)
简介 Uniform是一种从CPU中的应用向GPU中的着色器发送数据的方式,但uniform和顶点属性有些不同. 首先,uniform是全局的(Global).全局意味着uniform变量必须在每个着 ...
- 用js刷剑指offer(从尾到头打印链表)
题目描述 输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 牛客网链接 js代码 /*function ListNode(x){ this.val = x; this.next = nu ...
- 爬虫部署 --- scrapyd部署爬虫 + Gerapy 管理界面 scrapyd+gerapy部署流程
---------scrapyd部署爬虫---------------1.编写爬虫2.部署环境pip install scrapyd pip install scrapyd-client 启动scra ...