题目链接

正解:矩阵树定理+拉格朗日插值。

一下午就搞了这一道题,看鬼畜英文题解看了好久。。

首先这题出题人给了两种做法,感觉容斥+$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的更多相关文章

  1. Codeforces 917D - Stranger Trees(矩阵树定理/推式子+组合意义)

    Codeforces 题目传送门 & 洛谷题目传送门 刚好看到 wjz 在做这题,心想这题之前好像省选前做过,当时觉得是道挺不错的题,为啥没写题解呢?于是就过来补了,由此可见我真是个大鸽子(( ...

  2. 题解-Codeforces917D Stranger Trees

    Problem \(\mathrm{Codeforces~917D}\) 题意概要:一棵 \(n\) 个节点的无向树.问在 \(n\) 个点的完全图中,有多少生成树与原树恰有 \(k\) 条边相同,对 ...

  3. CF917D Stranger Trees

    CF917D Stranger Trees 题目描述 给定一个树,对于每个\(k=0,1\cdots n-1\),问有多少个生成树与给定树有\(k\)条边重合. 矩阵树定理+高斯消元 我们答案为\(f ...

  4. 【CF917D】Stranger Trees 树形DP+Prufer序列

    [CF917D]Stranger Trees 题意:给你一棵n个点的树,对于k=1...n,问你有多少有标号的n个点的树,与给出的树有恰好k条边相同? $n\le 100$ 题解:我们先考虑容斥,求出 ...

  5. Solution -「CF 917D」Stranger Trees

    \(\mathcal{Description}\)   Link.   给定一棵包含 \(n\) 个点的有标号树,求与这棵树重合恰好 \(0,1,\cdots,n-1\) 条边的树的个数,对 \(10 ...

  6. Codeforces 677C. Coloring Trees dp

    C. Coloring Trees time limit per test:2 seconds memory limit per test:256 megabytes input:standard i ...

  7. codeforces 711C Coloring Trees(DP)

    题目链接:http://codeforces.com/problemset/problem/711/C O(n^4)的复杂度,以为会超时的 思路:dp[i][j][k]表示第i棵数用颜色k涂完后bea ...

  8. 【动态规划】Codeforces 711C Coloring Trees

    题目链接: http://codeforces.com/problemset/problem/711/C 题目大意: 给N棵树,M种颜色,已经有颜色的不能涂色,没颜色为0,可以涂色,每棵树I涂成颜色J ...

  9. CF917D. Stranger Trees & TopCoder13369. TreeDistance(变元矩阵树定理+高斯消元)

    题目链接 CF917D:https://codeforces.com/problemset/problem/917/D TopCoder13369:https://community.topcoder ...

随机推荐

  1. react-native-image-picker在IOS上总是返回”Can’t find variable:response”的错误?

    环境: react-native: 0.41.2 react-native-image-picker: 0.26.2 xcode 8.2.1 iphone 6 根据官方教程(https://githu ...

  2. webpack 报错 No PostCSS Config found 解决方案。

    webpack 报错 No PostCSS Config found  这个问题我在百度上找了好久,也没有找到解决方案,最后没有办法只能自己去啃官方文档,本案例在本人的webpack 学习感悟中已经写 ...

  3. Redis---1、介绍

    Redis简介: 是以key-value形式存储,和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本要求. 优点: 对数据高并发读写 对海量数据的高效率存储和访问 对数据的可扩展性和高可用行 ...

  4. Java常用的排序算法三

    Merge Sort :归并排序:用递归的思想,分解成单个元素的排序,在归并 代码: import java.util.*; public class MergeSort { public stati ...

  5. jQuery的三种$()方式

    http://www.jb51.net/article/21660.htm   $号是jQuery“类”的一个别称,$()构造了一个jQuery对象.所以,“$()”可以叫做jQuery的构造函数(个 ...

  6. 如何在没有https环境下使用webrtc

    新版本的webrtc使用需要Https,但是在内网开发调试时,要配置Https环境比较麻烦,下面的方法是教你如何在http下使用webrtc 1,点桌面上的Chrome图票,右键->属性,把目票 ...

  7. ssh 连接慢问题

    连接先看报错: There were 11 failed login attempts since the last successful login. 先前有上百上千失败login,被攻击了,把短时 ...

  8. 经典的SQL面试题及答案

    ​ ​ ​ ​ ​ ​​​​​ ​ ​​​​​​​​

  9. POJ 2524(并查集)

    这道题多了一个检查是否包含所有元素 可以设一个cnt表示集合里的数量,再与外面比较 #include <cstdio> #include <iostream> #include ...

  10. CodeForces 614A(水题)

    这道题有个需要注意的地方,就是范围大小 2^16 = 65535,2^32 = 65535(10^4),2^16 = 4294967295(10^9),2^64=9223372036854775807 ...