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 ...
随机推荐
- 解读MySQL的慢日志
完整的慢日志格式一般如下: # Time: :: # User@Host: db_user[db_database] @ localhost [] # Query_time: Rows_examine ...
- jquery点击按钮或链接,第一次与第二次执行不同的事件
本文和大家分享一个jquery的实例,这个实例实现的是点击网页里的按钮或链接,第一次和第二次会执行不同的事件,也就是两个事件会轮流执行. <script language="javas ...
- MySQL---8、索引
1.索引中关于搜索的算法 2.索引的使用原则 3.索引的优缺点 4.索引的种类 5.显示索引 show index from 表名; 6.创建唯一索引 alter table 表名 add ...
- golang命令和VSCode配置
Go是一门全新的静态类型开发语言,具有自动垃圾回收.丰富的内置类型.函数多返回值.错误处理.匿名函数.并发编程.反射等特性 golang常用命令: go env #查看go的环境 echo %GORO ...
- [C#]LockBits使用笔记
昨天想基于一张图片做个手机锁屏来着,原图如下:主要是嫌白底太丑了,一开始是想画图工具直接油漆桶伺候,然而一浇上去就发现问题了,变成了这样:看来得手工处理一下把底色统一了,原图分辨率挺高的,SetPix ...
- 4、构造方法、this、super
构造方法 构造方法引入 * A:构造方法的引入 在开发中经常需要在创建对象的同时明确对象的属性值,比如员工入职公司就要明确他的姓名.年龄等属性信息. 那么,创建对象就要明确属性值,那怎么解决呢?也就是 ...
- 获取java根目录,加载根目录下的文件
就两句代码 String filepath = System.getProperty("user.dir")+"/a.xlsx"; File file=new ...
- Win10系统安装vmware workstation 12后没有桥接网卡怎么办
原文 vmware workstation是一款虚拟机计算机软件,可以同时运行不同的操作系统,然而有win10系统用户在安装vmware workstation 12之后,却发现网络连接里面没有桥接网 ...
- Python随笔目录
Python 一.Python基础 Python入门 数据类型 函数(迭代器生成器三元表达式) 模块和常用内置模块 面向对象 网络编程(socket) 并发编程 ... 二.数据库 MySQL PyM ...
- 将本地项目放到GitHub上托管并展示
忽然知道自己写的项目效果可以放到网上让别人看到之后,就已经迫不及待了.不墨迹,先去了解GitHub得知,它很强(牛逼),我理解的是这是一个托管平台,可以把自己本地的项目通过git放到上面,你需要新建一 ...