Codeforces917D. Stranger Trees
$n \leq 100$的完全图,对每个$0 \leq K \leq n-1$问生成树中与给定的一棵树有$K$条公共边的有多少个,答案$mod \ \ 1e9+7$。
对这种“在整体中求具有某些特性的部分”,可以通过把“特性”强行复制加入“整体”来考察新的整体与部分的关系。
说人话,在这里是要求完全图中与给定树有若干同样边的生成树,那尝试把这棵树复制一份进完全图再看生成树。可以发现,这样之后,新的完全图的生成树个数就是
$\sum_{i=0}^{n-1}2^i*[number \ \ of \ \ trees \ \ which \ \ have \ \ i \ \ common \ \ edges \ \ with \ \ the \ \ original \ \ tree]$
因为有$i$条公共边的话他在这张图里面这些公共边都有两种选择。类似得可以发现原完全图的生成树个数实际上就是所有要求的系数之和,原完全图相当于复制0次。依次类推,设$F(x)$为把树边复制$x-1$次得到完全图的生成树个数,那么
$F(x)=\sum_{i=0}^{n-1}x^i*[number \ \ of \ \ trees \ \ which \ \ have \ \ i \ \ common \ \ edges \ \ with \ \ the \ \ original \ \ tree]$
现在要求这些系数,但我们知道了n个自变量$x$和他们对应的$F(x)$(用无向图生成树计数--矩阵树定理),可以用多项式插值求出系数。我只会高斯消元求插值,因此复杂度$n^3+n^4$。
//#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
//#include<map>
#include<math.h>
//#include<time.h>
//#include<complex>
#include<algorithm>
using namespace std; int n,m;
#define maxn 111
const int mod=1e9+;
int ji[maxn][maxn],duo[maxn][maxn]; int powmod(int a,int b)
{
int ans=;
while (b)
{
if (b&) ans=1ll*ans*a%mod;
a=1ll*a*a%mod; b>>=;
}
return ans;
} int hh(int n)
{
int ans=;
for (int i=;i<=n;i++)
{
if (ji[i][i]==) for (int j=i+;j<=n;j++) if (ji[j][i])
{
ans=ans==?mod-:;
for (int k=i;k<=n;k++) {int t=ji[i][k]; ji[i][k]=ji[j][k]; ji[j][k]=t;}
break;
}
int pp=powmod(ji[i][i],mod-);
for (int j=i+;j<=n;j++)
{
int now=1ll*ji[j][i]*pp%mod;
for (int k=i;k<=n;k++) ji[j][k]-=1ll*ji[i][k]*now%mod,ji[j][k]+=ji[j][k]<?mod:;
}
}
for (int i=;i<=n;i++) ans=1ll*ans*ji[i][i]%mod;
return ans;
} void gauss(int n)
{
for (int i=;i<=n;i++)
{
if (duo[i][i]==) for (int j=i+;j<=n;j++) if (duo[j][i])
{
for (int k=i;k<=n+;k++) {int t=duo[i][k]; duo[i][k]=duo[j][k]; duo[j][k]=t;}
break;
}
int pp=powmod(duo[i][i],mod-);
for (int j=i+;j<=n;j++)
{
int now=1ll*duo[j][i]*pp%mod;
for (int k=i;k<=n+;k++) duo[j][k]-=1ll*duo[i][k]*now%mod,duo[j][k]+=duo[j][k]<?mod:;
}
}
for (int i=n;i;i--)
{
for (int j=n;j>i;j--) duo[i][n+]-=1ll*duo[i][j]*duo[j][n+]%mod,duo[i][n+]+=duo[i][n+]<?mod:;
duo[i][n+]=1ll*duo[i][n+]*powmod(duo[i][i],mod-)%mod;
}
} int mp[maxn][maxn],du[maxn],base[maxn][maxn];
int main()
{
scanf("%d",&n);
for (int i=,x,y;i<n;i++)
{
scanf("%d%d",&x,&y);
mp[x][y]++; mp[y][x]++; du[x]++; du[y]++;
}
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
{
if (i==j) base[i][j]=n-;
else base[i][j]=mod-;
}
for (int i=;i<n;i++)
{
memcpy(ji,base,sizeof(ji));
for (int j=;j<=n;j++) ji[j][j]+=du[j]*i;
for (int j=;j<=n;j++)
for (int k=;k<=n;k++)
if (j!=k && mp[j][k]) ji[j][k]-=i;
duo[i+][n+]=hh(n-);
for (int j=,tmp=;j<=n;j++,tmp=1ll*tmp*(i+)%mod) duo[i+][j]=tmp;
}
gauss(n);
for (int i=;i<=n;i++) printf("%d ",duo[i][n+]);
return ;
}
Codeforces917D. Stranger Trees的更多相关文章
- 题解-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$ 题解:我们先考虑容斥,求出 ...
- codeforces 917D Stranger Trees
题目链接 正解:矩阵树定理+拉格朗日插值. 一下午就搞了这一道题,看鬼畜英文题解看了好久.. 首先这题出题人给了两种做法,感觉容斥+$prufer$序列+$dp$的做法细节有点多所以没看,然而这个做法 ...
- [CF917D]Stranger Trees[矩阵树定理+解线性方程组]
题意 给你 \(n\) 个点的无向完全图,指定一棵树 \(S\),问有多少棵生成树和这棵树的公共边数量为 \(k\in[0,n-1]\) \(n\leq 100\) 分析 考虑矩阵树定理,把对应的树边 ...
- 【CF917D】Stranger Trees
题目 看题解的时候才突然发现\(zky\)讲过这道题啊,我现在怕不是一个老年人了 众所周知矩阵树求得是这个 \[\sum_{T}\prod_{e\in T}w_e\] 而我们现在的这个问题有些鬼畜了, ...
- CF917D. Stranger Trees & TopCoder13369. TreeDistance(变元矩阵树定理+高斯消元)
题目链接 CF917D:https://codeforces.com/problemset/problem/917/D TopCoder13369:https://community.topcoder ...
- CF917D Stranger Trees【矩阵树定理,高斯消元】
题目链接:洛谷 题目大意:给定一个$n$个节点的树$T$,令$ans_k=\sum_{T'}[|T\cap T'|=k]$,即有$k$条边重合.输出$ans_0,ans_1,\ldots,ans_{n ...
- 题解 CF917D 【Stranger Trees】
生成树计数问题用矩阵树定理来考虑. 矩阵树定理求得的为\(\sum\limits_T\prod\limits_{e\in T}v_e\),也就是所有生成树的边权积的和. 这题边是不带权的,应用矩阵树定 ...
随机推荐
- poj2385 Apple Catching
思路: 简单dp. 实现: #include <iostream> #include <cstdio> #include <cstring> using names ...
- 【学习笔记】C++ cout 输出小数点后指定位数
在C中我们可以使用 printf("%.2lf",a);但在C++中是没有格式操作符的,该如何操作: C++使用setprecision()函数,同时必须包含头文件iomanip, ...
- ASP.NET MVC IIS7 403.14-Forbidden
问题描述 IIS 7上发布ASP.NET MVC程序报错:403.14-Forbidden Web 服务器被配置为不列出此目录的内容 折腾了半天,提示里面的解决方法是: 如果不希望启用目录浏览,请确保 ...
- iview tabs里面放入 i-switch 注意slot不是写在 props里面
iview tabs里面放入 i-switch 注意slot不是写在 props里面 <Tabs value="name1"> <TabPane :label=& ...
- k8s 重要概念[转]
在实践之前,必须先学习 Kubernetes 的几个重要概念,它们是组成 Kubernetes 集群的基石. Cluster Cluster 是计算.存储和网络资源的集合,Kubernetes 利用这 ...
- PYTHON_DAY_02
今日内容: 01 列表内置方法 '''''' ''' 列表: 定义: 在[]内,可以存放多个任意类型的值, 并以逗号隔开. 一般用于存放学生的爱好,课堂的周期等等... ''' # 定义一个学生列表, ...
- 自己封装一个readline函数实现服务器客户端回射
实现的功能:一次只能读取一行,客户端输入之后,一回车,马上字符串传到服务器端并显示在终端,然后服务器端将字符串又传回给客户端. 服务器端可以接收多个客户端的连接请求,并fork一个子进程来进行服务. ...
- QT_仅仅直接在构造函数中创建对象的不可行的原因
#include "mainwidget.h" #include <QApplication> int main(int argc, char *argv[]) { Q ...
- 高德地图api之location定位
关于定位,分为GPS定位和网络定位.本文将详细描述的浏览器定位,属于网络定位.这是一种通过使用高德JS-API来实现位置定位.城市定位的方法,包含了IP定位,检索等多种网络定位方式.如果您的手机支持G ...
- Linux常用命令大全3
linux命令1,关机shutdown -h now2,init 0 关闭系统3,shutdown -h hours:minutes &按预定时间关闭系统4,shutdown -c取消按预定时 ...