codeforces 917D Stranger Trees
正解:矩阵树定理+拉格朗日插值。
一下午就搞了这一道题,看鬼畜英文题解看了好久。。
首先这题出题人给了两种做法,感觉容斥+$prufer$序列+$dp$的做法细节有点多所以没看,然而这个做法似乎更难想。。
我们先构造一个函数$f(x)$,表示用一个完全图和$x-1$棵原树的边,构成的生成树的方案数。
也就是说,原树的每条边复制成$x$条,不在原树的边都变成一条边,求这个图的生成树的方案数。
然后我们可以发现,这个方案数实际上就等于$\sum_{i=0}^{n-1}x^{i}*ans_{i}$,其中$ans_{i}$表示询问的恰好有$i$条边的答案。
稍微解释一下,我们选定了原树的$i$条边,那么原树这$i$条边每条边就有$x$种选择,其他边只有$1$种选择。
然后现在我们的目标就变成了求出这个函数所表示的多项式的系数。
那么我们可以算出$x$取$[1,n]$的答案,用拉格朗日插值求出多项式,计算答案可以用矩阵树定理。
复杂度为$O(n^{4}+n^{3})$,写完题解以后发现也不是很难。。
#include <bits/stdc++.h>
#define il inline
#define RG register
#define ll long long
#define rhl (1000000007)
#define N (105) using namespace std; int a[N][N],g[N][N],p[N],ans[N],fac[N],ifac[N],inv[N],n,len; il int gi(){
RG int x=,q=; RG char ch=getchar();
while ((ch<'' || ch>'') && ch!='-') ch=getchar();
if (ch=='-') q=-,ch=getchar();
while (ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return q*x;
} il int qpow(RG int a,RG int b){
RG int ans=;
while (b){
if (b&) ans=1LL*ans*a%rhl;
if (b>>=) a=1LL*a*a%rhl;
}
return ans;
} il int gauss(){
RG int res=;
for (RG int i=,id,inv;i<n;++i){
for (id=i;id<n && !a[id][i];++id); if (id>=n) return ;
if (id!=i){
for (RG int j=;j<n;++j) swap(a[i][j],a[id][j]);
res=-res;
}
res=1LL*res*a[i][i]%rhl,inv=qpow(a[i][i],rhl-);
for (RG int j=i+,tmp;j<n;++j){
if (!a[j][i]) continue;
tmp=1LL*a[j][i]*inv%rhl;
for (RG int k=i;k<n;++k)
a[j][k]=(a[j][k]-1LL*a[i][k]*tmp)%rhl;
}
}
return (res+rhl)%rhl;
} int main(){
#ifndef ONLINE_JUDGE
freopen("stranger.in","r",stdin);
freopen("stranger.out","w",stdout);
#endif
n=gi(),fac[]=ifac[]=;
for (RG int i=;i<=n;++i){
inv[i]=i==?:1LL*(rhl-rhl/i)*inv[rhl%i]%rhl;
fac[i]=1LL*fac[i-]*i%rhl;
ifac[i]=1LL*ifac[i-]*inv[i]%rhl;
}
for (RG int i=,u,v;i<n;++i)
u=gi(),v=gi(),g[u][v]=g[v][u]=;
for (RG int k=;k<=n;++k){
for (RG int i=;i<=n;++i)
for (RG int j=;j<=n;++j) a[i][j]=;
for (RG int i=;i<n;++i)
for (RG int j=i+,tmp;j<=n;++j){
tmp=g[i][j] ? k : ;
a[i][j]-=tmp,a[j][i]-=tmp;
a[i][i]+=tmp,a[j][j]+=tmp;
}
p[len=]=1LL*gauss()*ifac[k-]%rhl*ifac[n-k]%rhl;
if ((n-k)&) p[]=rhl-p[];
for (RG int t=,tmp;t<=n;++t){
if (k==t) continue; tmp=rhl-t;
for (RG int i=++len;~i;--i)
p[i]=(1LL*tmp*p[i]+(i?p[i-]:))%rhl;
}
for (RG int i=;i<=len;++i){
ans[i]+=p[i],p[i]=; if (ans[i]>=rhl) ans[i]-=rhl;
}
}
for (RG int i=;i<n;++i) printf("%d ",ans[i]); return ;
}
codeforces 917D Stranger Trees的更多相关文章
- Codeforces 917D - Stranger Trees(矩阵树定理/推式子+组合意义)
Codeforces 题目传送门 & 洛谷题目传送门 刚好看到 wjz 在做这题,心想这题之前好像省选前做过,当时觉得是道挺不错的题,为啥没写题解呢?于是就过来补了,由此可见我真是个大鸽子(( ...
- 题解-Codeforces917D Stranger Trees
Problem \(\mathrm{Codeforces~917D}\) 题意概要:一棵 \(n\) 个节点的无向树.问在 \(n\) 个点的完全图中,有多少生成树与原树恰有 \(k\) 条边相同,对 ...
- CF917D Stranger Trees
CF917D Stranger Trees 题目描述 给定一个树,对于每个\(k=0,1\cdots n-1\),问有多少个生成树与给定树有\(k\)条边重合. 矩阵树定理+高斯消元 我们答案为\(f ...
- 【CF917D】Stranger Trees 树形DP+Prufer序列
[CF917D]Stranger Trees 题意:给你一棵n个点的树,对于k=1...n,问你有多少有标号的n个点的树,与给出的树有恰好k条边相同? $n\le 100$ 题解:我们先考虑容斥,求出 ...
- Solution -「CF 917D」Stranger Trees
\(\mathcal{Description}\) Link. 给定一棵包含 \(n\) 个点的有标号树,求与这棵树重合恰好 \(0,1,\cdots,n-1\) 条边的树的个数,对 \(10 ...
- Codeforces 677C. Coloring Trees dp
C. Coloring Trees time limit per test:2 seconds memory limit per test:256 megabytes input:standard i ...
- codeforces 711C Coloring Trees(DP)
题目链接:http://codeforces.com/problemset/problem/711/C O(n^4)的复杂度,以为会超时的 思路:dp[i][j][k]表示第i棵数用颜色k涂完后bea ...
- 【动态规划】Codeforces 711C Coloring Trees
题目链接: http://codeforces.com/problemset/problem/711/C 题目大意: 给N棵树,M种颜色,已经有颜色的不能涂色,没颜色为0,可以涂色,每棵树I涂成颜色J ...
- CF917D. Stranger Trees & TopCoder13369. TreeDistance(变元矩阵树定理+高斯消元)
题目链接 CF917D:https://codeforces.com/problemset/problem/917/D TopCoder13369:https://community.topcoder ...
随机推荐
- T4模板的一些配置(从EF数据更新)
<#@ template debug="false" hostspecific="false" language="C#" #> ...
- 页面滚动条&按键执行事件
判断页面滚动条 $(window).bind('scroll', function () { //算出鼠标移动到顶部的高度. var scrollt = document.documentElemen ...
- 阿里java面试题,你能答对多少?
答对以下这些面试题,可以淘汰掉 80 % 的求职竞争者. 1.hashcode相等两个类一定相等吗?equals呢?相反呢? 2.介绍一下集合框架? 3.hashmap hastable 底层实现什么 ...
- Bzoj4766: 文艺计算姬(Matrix-tree/prufer)
BZOJ 答案就是 \(n^{m-1}m^{n-1}\) \(prufer\) 证明: \(n\) 中的数字出现 \(m-1\) 次,\(m\) 中出现 \(n-1\) 次,根据 \(prufer\) ...
- [CTSC2008]祭祀(构造方案)
前面的话 这道题显然就是最长反链 根据 \(Dilworth\) 定理:最小链覆盖数 = 最长反链长度 然后传递闭包跑匹配即可 \(luogu\)交了一下,\(WA\) 了 \(QAQ\) 本来各种 ...
- 公共cdn的js和css库
使用cdn的js和css公用库 为什么要使用cdn,用cdn资源有什么好处了,可以看看yahoo性能建议,中间有一条的http://developer.yahoo.com/performance/ru ...
- 编辑文本(EditText)
今天要给大家介绍的是简单的编辑文本框: 先看一下它的基本属性: 1.Activity public class EditTextActivity extends Activity { private ...
- Linux下vim(文本编译器)的使用
vim (文本编译器): Vim是从 vi 发展出来的一个文本编辑器. vim的一些命令操作: 插入命令: a 在光标所在字符后插入 A 在光标所在行尾插入 i 在光标所在字符前插入 I 在光标所在行 ...
- CentOS 7 Apache 多端口部署 Web Apps 指南
转载自简书,原作者xuyan0,链接https://www.jianshu.com/p/b34c78bf9bf0,如有侵权,请联系删除 导语 Apache web 服务器运行着互联网上超过半数的活跃的 ...
- ViewDragHelper详解(侧滑栏)
1.Drag拖拽:ViewDrag拖拽视图,拖拽控件:ViewDragHelper拖拽视图助手,拖拽操作类.利用ViewDragHelper类可以实现很多绚丽的效果,比如:拖拽删除,拖拽排序,侧滑栏等 ...