生成树计数问题用矩阵树定理来考虑。

矩阵树定理求得的为\(\sum\limits_T\prod\limits_{e\in T}v_e\),也就是所有生成树的边权积的和。

这题边是不带权的,应用矩阵树定理前,我们必须考虑给每条边赋上一个权值。

可以从多项式的角度来考虑解决生成树和给定树有\(k\)条边重复这一条件,将给定树的边边权赋为\(x\),其余边赋为\(1\),那么应用矩阵树定理后得到的多项式中第\(k\)次项\(x^k\)的系数即为恰好有\(k\)条边重复的方案数。

发现直接代入多项式来求行列式不太现实,那么可以先求得\(x\)在取\(1\)到\(n\)时行列式的值,然后就得到了\(n\)个方程,把原多项式的系数看作未知数,代入\(x\)得到的值来作为现在的系数,那么就可以通过高斯消元来求解了。

具体实现看代码吧。

\(code:\)

#include<bits/stdc++.h>
#define maxn 210
#define mod 1000000007
using namespace std;
typedef long long ll;
template<typename T> inline void read(T &x)
{
x=0;char c=getchar();bool flag=false;
while(!isdigit(c)){if(c=='-')flag=true;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
if(flag)x=-x;
}
ll n;
ll a[maxn][maxn],b[maxn][maxn],e[maxn][maxn];
ll inv(ll x)
{
ll y=mod-2,ans=1;
while(y)
{
if(y&1) ans=ans*x%mod;
x=x*x%mod;
y>>=1;
}
return ans;
}
ll det()
{
ll ans=1;
for(int i=1;i<n;++i)
{
ll p=inv(b[i][i]);
for(int j=i+1;j<n;++j)
{
ll d=b[j][i]*p%mod;
for(int k=i;k<n;++k)
b[j][k]=(b[j][k]-b[i][k]*d%mod+mod)%mod;
}
ans=ans*b[i][i]%mod;
if(!b[i][i]) return 0;
}
return ans;
}
void gauss()
{
for(int i=1;i<=n;++i)
{
ll d=inv(a[i][i]);
for(int j=i;j<=n+1;++j) a[i][j]=a[i][j]*d%mod;
for(int j=i+1;j<=n;++j)
{
d=a[j][i];
for(int k=i;k<=n+1;++k)
a[j][k]=(a[j][k]-a[i][k]*d%mod+mod)%mod;
}
}
for(int i=n;i;--i)
for(int j=i-1;j;--j)
a[j][n+1]=(a[j][n+1]-a[j][i]*a[i][n+1]%mod+mod)%mod;
}
int main()
{
read(n);
for(int i=1;i<n;++i)
{
int x,y;
read(x),read(y);
e[x][y]=e[y][x]=1;
}
for(int i=1;i<=n;++i)
{
a[i][1]=1;
for(int j=2;j<=n;++j)
a[i][j]=a[i][j-1]*i%mod;
}
for(int k=1;k<=n;++k)
{
for(int i=1;i<=n;++i)
{
b[i][i]=0;
for(int j=1;j<=n;++j)
{
if(i==j) continue;
if(e[i][j]) b[i][j]=mod-k,b[i][i]+=k;
else b[i][j]=mod-1,b[i][i]++;
}
}
a[k][n+1]=det();
}
gauss();
for(int i=1;i<=n;++i) printf("%lld ",a[i][n+1]);
return 0;
}

题解 CF917D 【Stranger Trees】的更多相关文章

  1. CF917D Stranger Trees

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

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

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

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

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

  4. 题解-Codeforces917D Stranger Trees

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

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

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

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

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

  7. 【CF917D】Stranger Trees

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

  8. codeforces 917D Stranger Trees

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

  9. Codeforces917D. Stranger Trees

    $n \leq 100$的完全图,对每个$0 \leq K \leq n-1$问生成树中与给定的一棵树有$K$条公共边的有多少个,答案$mod \ \ 1e9+7$. 对这种“在整体中求具有某些特性的 ...

随机推荐

  1. 手把手教你使用Python抓取QQ音乐数据(第二弹)

    [一.项目目标] 通过Python爬取QQ音乐数据(一)我们实现了获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 此次我们在之前的基础上获取QQ音乐指定歌曲的歌词及前15个精 ...

  2. 入门大数据---Hadoop是什么?

    简单概括:Hadoop是由Apache组织使用Java语言开发的一款应对大数据存储和计算的分布式开源框架. Hadoop的起源 2003-2004年,Google公布了部分GFS和MapReduce思 ...

  3. 入门大数据---Hbase是什么?

    一.Hbase是什么? Hbase属于NoSql的一种. NoSql数据库分为如下几类: Key-Value类型数据库 这类数据库主要会使用到一个哈希表,这个表有一个特定的键和一个指针指向特定的数据. ...

  4. Salesforce LWC学习(十八) datatable展示 image

    本篇参看: https://developer.salesforce.com/docs/component-library/bundle/lightning-datatable/documentati ...

  5. 使用docker创建mysql容器

    1.拉取mysql容器   docker pull mysql:5.7

  6. 客官,来看看AspNetCore的身份验证吧

    开篇 这段时间潜水了太久,终于有时间可以更新一篇文章了. 通过本篇文章您将Get: Http的一些身份验证概念 在AspNetCore中实现身份验证方案 JWT等概念的基础知识 使用Bearer To ...

  7. Java BigDecimal和double BigDecimal类

    BigDecimal类 对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数 ...

  8. 前端日常工作中常用开发小技巧 ---JavaScript

    1.格式化金钱值 const ThousandNum = num => num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, "," ...

  9. 哈希传递攻击利用(Pass The Hash)

    最近又复习了一下内网的相关知识,把以前的整理了一下发出来做个记录. 0x01 哈希传递攻击概念 有一点内网渗透经验的都应该听说过哈希传递攻击,通过找到相应账户相关的密码散列值(LM Hash,NTLM ...

  10. 恕我直言你可能真的不会java第12篇-如何使用Stream API对Map类型元素排序

    在这篇文章中,您将学习如何使用Java对Map进行排序.前几日有位朋友面试遇到了这个问题,看似很简单的问题,但是如果不仔细研究一下也是很容易让人懵圈的面试题.所以我决定写这样一篇文章.在Java中,有 ...