$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的更多相关文章

  1. 题解-Codeforces917D Stranger Trees

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

  2. CF917D Stranger Trees

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

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

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

  4. codeforces 917D Stranger Trees

    题目链接 正解:矩阵树定理+拉格朗日插值. 一下午就搞了这一道题,看鬼畜英文题解看了好久.. 首先这题出题人给了两种做法,感觉容斥+$prufer$序列+$dp$的做法细节有点多所以没看,然而这个做法 ...

  5. [CF917D]Stranger Trees[矩阵树定理+解线性方程组]

    题意 给你 \(n\) 个点的无向完全图,指定一棵树 \(S\),问有多少棵生成树和这棵树的公共边数量为 \(k\in[0,n-1]\) \(n\leq 100\) 分析 考虑矩阵树定理,把对应的树边 ...

  6. 【CF917D】Stranger Trees

    题目 看题解的时候才突然发现\(zky\)讲过这道题啊,我现在怕不是一个老年人了 众所周知矩阵树求得是这个 \[\sum_{T}\prod_{e\in T}w_e\] 而我们现在的这个问题有些鬼畜了, ...

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

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

  8. CF917D Stranger Trees【矩阵树定理,高斯消元】

    题目链接:洛谷 题目大意:给定一个$n$个节点的树$T$,令$ans_k=\sum_{T'}[|T\cap T'|=k]$,即有$k$条边重合.输出$ans_0,ans_1,\ldots,ans_{n ...

  9. 题解 CF917D 【Stranger Trees】

    生成树计数问题用矩阵树定理来考虑. 矩阵树定理求得的为\(\sum\limits_T\prod\limits_{e\in T}v_e\),也就是所有生成树的边权积的和. 这题边是不带权的,应用矩阵树定 ...

随机推荐

  1. CF778B(round 402 div.2 E) Bitwise Formula

    题意: Bob recently read about bitwise operations used in computers: AND, OR and XOR. He have studied t ...

  2. postgresql版sde(10.4.1)安装说明

    从ArcGIS 10.3开始,彻底没有了sde的安装包,安装sde数据库需要先安装arcgis desktop,通过arccatalog建数据库,同时也不能建sde服务,只能使用直连 以下演示在sde ...

  3. Data Center Manager Leveraging OpenStack

    这是去年的一个基于OpenStack的数据中心管理软件的想法. Abstract OpenStack facilates users to provision and manage cloud ser ...

  4. log4j 日志分级处理

    log4j 配置文件: log4j.rootLogger=debug,stdout,debug,info,errorlog4j.appender.stdout=org.apache.log4j.Con ...

  5. 8.3.3 快速系统调用 —— XP SP3上SystemCallStub的奇怪问题

    依书上的例子,ReadFile()函数会调用ntdll!NtReadFile(),后者将服务号放到eax之中,然后调用SharedUserData!SystemCallStub(),由此函数执行sys ...

  6. help命令

    help——获得Shell内置命令的帮助信息 命令所在路径:Shell内置命令 示例1: # help cd 使用which或者whereis查找不到路径的命令一般是Shell内置命令,cd就是一个S ...

  7. powerDesigner 把name项添加到注释(comment),完美方案!

    第一次写博客,分享一点经验吧,平时大家用powerDesigner的时候,pd是不会把name项默认添加到comment的,所以生成的数据库表里面也没有中文字段的注释. 我在网上查了一下.有解决方案了 ...

  8. 中间件及tomcat的内存溢出调优

    主要是这三个选项的调整需要根据主机的内存配置 以及业务量的使用情况调节 -Xmx4g -Xms4g -Xmn2g xmx 与xms一般设置为一样 xmn大致设置为xmx xms的三分之一   可以使用 ...

  9. docker 搭建 Java Web 运行环境

    安装环境:jdk,tomcat,mysql,nginx

  10. DROP DOMAIN - 删除一个用户定义的域

    SYNOPSIS DROP DOMAIN name [, ...] [ CASCADE | RESTRICT ] DESCRIPTION 描述 DROP DOMAIN 将从系统表中删除一个用户域. 只 ...