题目链接

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

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

首先这题出题人给了两种做法,感觉容斥+$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. TabControl 选项卡控件

    TabControl 控件是由System.Windows.Forms.TabControl类提供的,作用就是讲相关的组件组合到一系列选项卡页面上.   MulitiLine 属性用来设置是否显示多行 ...

  2. jenkins学习之centos6.9下安装

    以下为centos6.9下测试安装: docker下安装jenkins: 更新yum源: yum -y update 安装docker: yum -y install docker-io 启动dock ...

  3. nvm安装最新稳定版node

    安装当前最新的稳定版. nvm install stable

  4. mongo_connector.oplog_manager:670 - Exception during collection dump

    今天再整合mongodb和elasticsearch时,执行最后一步命令 “mongo-connector -m -m localhost:8090 -t  -t -t localhost:9200 ...

  5. 线程协作--wait,notify:经典消费者生产者

    JDK 中关于wait,notify这两个方法的介绍: 1.wait:线程进入阻塞. synchronized (obj) { while (<condition does not hold&g ...

  6. VC+++ 操作word

    最近完成了一个使用VC++ 操作word生成扫描报告的功能,在这里将过程记录下来,开发环境为visual studio 2008 导入接口 首先在创建的MFC项目中引入word相关组件 右键点击 项目 ...

  7. rocketmq 控制台 trackType NOT_CONSUME_YET

    1. 问题描述 rocketmq消费者偶有没有收到消息,查看后台, 显示NOT_CONSUME_YET 2. 分析 mq控制台 显示有该条消息数据 只是状态为未消费 那么问题应该出在 消费者一方 诶? ...

  8. java线程的常用方法

    java线程的常用方法 编号 方法 说明 1 public void start() 使该线程开始执行:Java 虚拟机调用该线程的 run 方法. 2 public void run() 如果该线程 ...

  9. Python之装饰器复习

    一.什么是装饰器? 装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象. 二.强调装饰器的原则: 1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式 3:在遵循1和2 ...

  10. 苹果ios,下拉菜单错位的问题(目前iphone x没发现有这个问题)

    苹果手机,点击下拉框,再点击确认按钮,页面位置错乱(感觉背景整体往上移动了一段距离,并且,页面所有的元素都往上移了一定的距离),导致手机页面底部留白的问题,并且,元素实际位置跟页面位置不一致. 解决方 ...