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\),也就是所有生成树的边权积的和. 这题边是不带权的,应用矩阵树定 ...
随机推荐
- iOS三句话实现文本转语音:AVSpeechSynthesizer
一.介绍 从iOS5开始,iOS系统已经在siri上集成了语音合成的功能,但是是私有API.但是在iOS7,新增了一个简单的API----AVSpeechSynthesizer来做这件事情. 二.案例 ...
- spring事务问题
springmvc中在service层中有如下逻辑:1.提交事务2.开启新线程,新线程中的业务依赖1中提交的事务处理办法:在service中新建一个方法do,调本地提交事务的方法doTranction ...
- 03.Java多线程并发库API使用2
1.多个线程之间共享数据的方式探讨 1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 2.如果每个线程执行的代 ...
- python中的get函数
>>> a={1:'a',2:'b'}>>> print a.get(1)a>>> print a.get(3)None
- LC.exe 已退出,代码为-1 问题解决
最近一个c#工程,之前编译正常.后重装系统,安装DevExpress后,编译一直失败,并提示"4>C:\Windows\Microsoft.NET\Framework\v4.0.303 ...
- [Github筆記] 清除所有 Commit 紀錄
# 把原來的 git 移除掉 sudo rm .git -r # 初始化 git init git remote add origin https://github.com/username/repo ...
- 简洁的KVO -- 使用Block响应事件
涉及内容: KVO,Runtime,Category,Block 首先创建NSObject的Category 举个例子是这样的: 随后定义你需要响应的Block结构 我简单一点就这样咯 typedef ...
- uva12265 Selling Land
见紫书.(c,h)的更新策略://前面的高度为0了,直接插入因为ans==-c+h,c大,h还小,那么肯定不是最优左上角,更新新加入列的列//新的一列高度最小,就删掉了其他的,只留这个高度从上到下,从 ...
- 【lua实战摸索】在b.lua调用a.lua的函数
需要掌握知识: lua table的使用(创建自己函数的表作为函数库) 普通函数的调用:tab.func(tab,参数) 等效于表中函数的调用tab:func(参数) 基本思路: 1.在相同目录下创建 ...
- c:if标签--判断不为空和其他的值判断
用<c:if test=""></c:if>标签时 <c:if test="${sl.chc_status==1 }"> ...