[CF917D]Stranger Trees[矩阵树定理+解线性方程组]
题意
给你 \(n\) 个点的无向完全图,指定一棵树 \(S\),问有多少棵生成树和这棵树的公共边数量为 \(k\in[0,n-1]\)
\(n\leq 100\)
分析
考虑矩阵树定理,把对应的树边的边权设置成 \(x\) 然后构造基尔霍夫矩阵, 结果记为 \(val\) ,有
\[val=\sum_\limits{i=0}^{n-1}x^ians_i
\]其中 \(ans_i\) 表示和 \(S\) 的公共边数量为 \(i\) 的生成树的个数。
发现这是一个关于 \(x\) 的多项式,我们要求每一项的系数 \(ans_i\) ,所以搞出 \(x\in[0, n -1]\) 的 \(val\) 然后高斯消元即可。
总时间复杂度为 \(O(n^4)\)。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define go(u) for(int i = head[u], v = e[i].to; i; i=e[i].lst, v=e[i].to)
#define rep(i, a, b) for(int i = a; i <= b; ++i)
#define pb push_back
inline int gi() {
int x = 0,f = 1;
char ch = getchar();
while(!isdigit(ch)) {
if(ch == '-') f = -1;
ch = getchar();
}
while(isdigit(ch)) {
x = (x << 3) + (x << 1) + ch - 48;
ch = getchar();
}
return x * f;
}
template <typename T> inline void Max(T &a, T b){if(a < b) a = b;}
template <typename T> inline void Min(T &a, T b){if(a > b) a = b;}
const int N = 104, mod = 1e9 + 7;
int n;
LL a[N][N], G[N][N], gg[N][N];
LL Pow(LL a, LL b) {
LL res = 1ll;
for(; b; b >>= 1, a = a * a % mod) if(b & 1) res = res * a % mod;
return res;
}
void Gauss(int n, int m, LL (*G)[N]) {
for(int u =0, col = 0; col <= m; ++col, ++u) {
int sel = u;
for(;sel <= n && !G[sel][col]; ++sel);
if(sel > n) { --u; continue;}
if(sel ^ u) {for(int i = 1; i <= m + 1; ++i) swap(G[u][i], G[sel][i]);}
LL inv = Pow(G[u][col], mod - 2);
for(int i = col; i <= m + 1; ++i) G[u][i] = G[u][i] * inv % mod;
for(int v = 1; v <=n; ++v)if(u ^ v) {
LL x = G[v][col];
for(int i = col; i <= m + 1; ++i) G[v][i] = ((G[v][i] - G[u][i] * x) % mod + mod) % mod;
}
}
}
LL det(int n, int m, LL (*G)[N]) {
LL c = 0;
for(int u = 2, col = 2; col <= m; ++col, ++u) {
int sel = u;
for(;sel <= n && !G[sel][col]; ++sel);
if(sel > n) { u--; continue;}
if(sel ^ u) {c ^= 1; for(int i = 1; i <= m; ++i) swap(G[u][i], G[sel][i]);}
for(int v = u + 1; v <= n; ++v)
while(G[v][col]) {
LL x = G[v][col] / G[u][col];
for(int i = col; i <= m; ++i) G[v][i] = ((G[v][i] - x * G[u][i])%mod + mod) % mod;
if(!G[v][col]) break;
c ^= 1;
for(int i = 1; i <= m; ++i) swap(G[u][i], G[v][i]);
}
}
LL ans = 1ll;
for(int i = 2; i <= n; ++i) ans = ans * G[i][i] % mod;
if(c) ans = mod - ans;
return ans;
}
int main() {
n = gi();
rep(i, 1, n - 1){
int u = gi(), v = gi();
a[u][v] ++, a[v][u] ++;
}
rep(x, 0, n - 1) {
memset(G, 0, sizeof G);
rep(i, 1, n)
rep(j, 1, n) {
G[j][j] += (a[i][j] ? x : 1);
G[i][j] -= (a[i][j] ? x : 1);
}
rep(i, 1, n)
rep(j, 1, n) if(G[i][j] < 0) G[i][j] += mod;
gg[x][n] = det(n, n, G);
LL tmp = 1;
for(int i = 0; i < n; ++i, tmp = tmp * x % mod) gg[x][i] = tmp;
}
Gauss(n - 1, n - 1, gg);
for(int i = 0; i < n; ++i) printf("%lld%c", gg[i][n], i == n?'\n':' ');
return 0;
}
[CF917D]Stranger Trees[矩阵树定理+解线性方程组]的更多相关文章
- CF917D. Stranger Trees & TopCoder13369. TreeDistance(变元矩阵树定理+高斯消元)
题目链接 CF917D:https://codeforces.com/problemset/problem/917/D TopCoder13369:https://community.topcoder ...
- Codeforces 917D - Stranger Trees(矩阵树定理/推式子+组合意义)
Codeforces 题目传送门 & 洛谷题目传送门 刚好看到 wjz 在做这题,心想这题之前好像省选前做过,当时觉得是道挺不错的题,为啥没写题解呢?于是就过来补了,由此可见我真是个大鸽子(( ...
- CF917D Stranger Trees
CF917D Stranger Trees 题目描述 给定一个树,对于每个\(k=0,1\cdots n-1\),问有多少个生成树与给定树有\(k\)条边重合. 矩阵树定理+高斯消元 我们答案为\(f ...
- 【Learning】矩阵树定理 Matrix-Tree
矩阵树定理 Matrix Tree 矩阵树定理主要用于图的生成树计数. 看到给出图求生成树的这类问题就大概要往这方面想了. 算法会根据图构造出一个特殊的基尔霍夫矩阵\(A\),接着根据矩阵树定理, ...
- 4.9 省选模拟赛 生成树求和 变元矩阵树定理 生成函数 iDFT 插值法
有同学在loj上找到了加强版 所以这道题是可以交的.LINK:生成树求和 加强版 对于30分 爆搜 可实际上我爆搜只过了25分 有同学使用按秩合并并茶几的及时剪枝通过了30分. const int M ...
- UOJ 75 - 【UR #6】智商锁(矩阵树定理+随机+meet-in-the-middle)
题面传送门 一道很神的矩阵树定理+乱搞的题 %%%%%%%%%%%%%%% vfk yyds u1s1 这种题目我是根本想不出来/kk,大概也就 jgh 这样的随机化带师才能想到出来吧 首先看到生成树 ...
- [spoj104][Highways] (生成树计数+矩阵树定理+高斯消元)
In some countries building highways takes a lot of time... Maybe that's because there are many possi ...
- BZOJ 4766: 文艺计算姬 [矩阵树定理 快速乘]
传送门 题意: 给定一个一边点数为n,另一边点数为m,共有n*m条边的带标号完全二分图$K_{n,m}$ 求生成树个数 1 <= n,m,p <= 10^18 显然不能暴力上矩阵树定理 看 ...
- bzoj 4596 [Shoi2016]黑暗前的幻想乡 矩阵树定理+容斥
4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 559 Solved: 325[Submit][Sta ...
随机推荐
- PMS与orcalebs结合之字段
call fnd_global.APPS_INITIALIZE(1318,50583,401) select fnd_profile.VALUE('ORG_ID') FROM DUAL select ...
- Python3 sqlacodegen 根据已有数据库生成 ORM 使用的 model.py
pip install sqlacodegen pip install pymysql sqlacodegen mysql+pymysql://username:password@127.0.0.1: ...
- Sysstat的工具集sar、 iostat、mpstat、sadf、sar、sadc
sysstat Sysstat的工具集sar. iostat.mpstat.sadf.sar.sadc * iostat 工具提供CPU使用率及硬盘吞吐效率的数据: * mpstat 工具提供单个处理 ...
- load file within a jar
String examplejsPrefix = "example"; String examplejsSuffix = "js"; String exampl ...
- tp5多数据库配置
1.在项目文件下建立extra文件夹,复制dadabase.php改名为database_foo.php,并将从数据库配置信息配置好,如下图: 2.调用 1)调用从数据库$data = Db::con ...
- linux 下获取文件最后几行
在Linux下,获取文件倒数几行的命令是: tail -n 10 your_filename #获取倒数10行
- Programming Assignment 3: Pattern Recognition
编程作业三 作业链接:Pattern Recognition & Checklist 我的代码:BruteCollinearPoints.java & FastCollinearPoi ...
- Hello Shader之Hello Trangle
这两天配了一下现代OpenGL的开发环境,同时看了一下基础知识和编程规范 写了一个编译GLSL语言的前端程序和一个Hello trangle的程序 另外,推荐两个资源 1.学习网站Learn Open ...
- Arthas开源项目
本文主要围绕着Arthas是什么.能做什么.安装和使用等三个方面内容来讲解,希望对初学者和对此有兴趣的朋友有帮助. 一. Arthas是什么 文档地址: https://alibaba.github. ...
- 理解传说中的roll、yaw、pitch
三维中 Yaw, pitch and roll 的区分(图片) yaw 航偏 pi ...