首页 > 其他分享 > AT_tdpc_tree 木

AT_tdpc_tree 木

时间:2023-11-15 11:46:34浏览次数:84  
标签:sz 连边 int res tree tdpc maxn mod

题目描述:

给定一棵大小为 \(n\) 的树,用另外 \(n\) 个点加边构造出这棵树,要求构造时所被边连到的点联通,求有多少连边顺序。

数据范围:

\(1 \leq n \leq 1000\)。

思路:

首先我们发现,因为题目要求连边后一定是一个连通块,所以考虑以哪一个点作为起点,然后向下连边。

所以我们得到一个初步的思路:枚举点 \(u\) 求出以 \(u\) 为根的连边方案数

然后我们就思考一下怎么处理这个问题?

考虑树形 \(Dp\):令 \(f_u\) 表示以 \(u\) 为根的子树连边的方案数是多少。

假设我们已经算出了 \(f_v\),考虑怎么将 \(f_v\) 合并到 \(f_u\) 中。

\(u\) 的儿子之间的连边其实是独立的,也就是说如果我们确定了 \(v\) 中的连边顺序,则只要这个连边的相对顺序不变,就可以成为一个合法的方案。

所以假设枚举到了 \(v\),并且当前这些子树中的边的数量为 \(sz_u\),子树 \(v\) 中的边的数量为 \(sz_v\)

则方案数就是 \(\binom{sz_u}{sz_v}\),即从 \(sz_u\) 条边中,选 \(sz_v\) 个位置放 \(v\) 子树内填的边。

所以可以得出 \(f_u\gets f_v\times \binom{sz_u}{sz_v}\)

注意的是,这里的 \(sz_u\) 都是指的是边数,而不是点数。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=1005;
const int mod=1e9+7;
int fac[maxn],inv[maxn];
int qp(int x,int k){
    int res=1;
    while(k){
        if(k&1)res=res*x%mod;
        x=x*x%mod;
        k>>=1;
    }
    return res;
}
void init(){
    int N=maxn-5;
    fac[0]=1;
    for(int i=1;i<=N+1;i++)fac[i]=fac[i-1]*i%mod;
    inv[N+1]=qp(fac[N+1],mod-2);
    for(int i=N;i>=0;i--)inv[i]=inv[i+1]*(i+1)%mod;
    return ;
}
int C(int n,int m){
    if(n<m||m<0)return 1;
    return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
int n;
vector<int>G[maxn];
int sz[maxn],dep[maxn],f[maxn];
void dfs(int u,int fa){
    f[u]=1;
    sz[u]=0;
    for(int v:G[u]){
        if(v==fa)continue;
        dfs(v,u);
        sz[u]+=sz[v];
        f[u]=f[u]*f[v]%mod*C(sz[u],sz[v])%mod;
    }
    sz[u]++;
    return ;
}
signed main(){
    cin>>n;
    for(int i=1;i<n;i++){
        int u,v;
        cin>>u>>v;
        G[u].push_back(v);
        G[v].push_back(u);
    }
    init();
    int ans=0;
    for(int i=1;i<=n;i++){
        dfs(i,0);
        ans=(ans+f[i])%mod;
    }
    cout<<ans*qp(2,mod-2)%mod<<endl;
    return 0;
}

标签:sz,连边,int,res,tree,tdpc,maxn,mod
From: https://www.cnblogs.com/Candycar/p/17833460.html

相关文章

  • element-ui tree 异步树实现勾选自动展开、指定展开、指定勾选
    element-uitree异步树实现勾选自动展开、指定展开、指定勾选 背景项目中用到了vue的element-ui框架,用到了el-tree组件。由于数据量很大,使用了数据懒加载模式,即异步树。异步树采用复选框进行结点选择的时候,没法自动展开,官方文档找了半天也没有找到好的办法!找不到相关的配......
  • D. Score of a Tree
    D.ScoreofaTreeYouaregivenatreeof$n$nodes,rootedat$1$.Everynodehasavalueofeither$0$or$1$attime$t=0$.Atanyintegertime$t>0$,thevalueofanodebecomesthebitwiseXORofthevaluesofitschildrenattime$t-1$;theva......
  • [题解] CFgym101623F Factor-Free Tree
    Factor-FreeTree当一棵二叉树中的每个节点的权值都与它所有祖先的权值互质时,我们称它为factor-freetree。给你一棵按照中序遍历的顺序的权值序列\(a\),求这个序列是否对应这一棵factor-freetree。如果是就输出每个节点的父亲。\(n\le10^5,a_i\le10^7\)。考虑怎么......
  • 【刷题笔记】108. Convert Sorted Array to Binary Search Tree
    题目Givenanarraywhereelementsaresortedinascendingorder,convertittoaheightbalancedBST.Forthisproblem,aheight-balancedbinarytreeisdefinedasabinarytreeinwhichthedepthofthetwosubtreesof every nodeneverdifferbymorethan......
  • TreeSet
    TreeSet的基本操作放到TreeSet集合中的元素:无序不可重复,但是可以按照元素的大小顺序自动排序(默认升序)//集合的创建TreeSet<Integer>treeSet=newTreeSet<>();//添加元素treeSet.add(1);treeSet.add(10);treeSet.add(199);treeSet.add(41);treeSet.add(0);//遍......
  • 数据存储和检索:B-tree 和 LSM-tree
     本文主要介绍数据库的核心数据结构索引的实现方式:B+tree和LSM-tree。实际上,数据库是可以不存在索引结构的,遍历数据库总归可以实现数据库的查询,但是,如果数据量很大,这种低效的做法是不可接受的,那么自然而然,牺牲部分空间换取时间被提出和接受,即保留额外的元数据,实现数据......
  • CF1304E 1-Trees and Queries(lca+树上前缀和+奇偶性)
    题目二话不说,直接按题意模拟暴搜,当然\(O(nq)\)的复杂度显然是寄了的。不过,在模拟的过程中,我在链式前向星的删边中居然一开始错了,还是要mark一下以后注意。voiddel(intx,intpre){ e[top].to=e[top].next=0; h[x]=pre;//h[x]=0;<---tip}intmain(){ ......
  • Planting Trees and Glasses--- Holding Back Soil Erosion
    Plantingtreesandglasses植树种草 Ganzhou, a typical red soil hilly area in Jiangxi province, is a pilot area for high-quality development of soil and water conservation in China. Through a series of following innovative in......
  • 【刷题笔记】104. Maximum Depth of Binary Tree
    题目Givenabinarytree,finditsmaximumdepth.Themaximumdepthisthenumberofnodesalongthelongestpathfromtherootnodedowntothefarthestleafnode.Note:Aleafisanodewithnochildren.Example:Givenbinarytree[3,9,20,null,null,15,7],......
  • 树状数组(Binary Index Tree)
    一、问题引入LoguP3374模版题--树状数组。初始化一个数组,接下来进行若干次以下操作:单点修改:将某个元素的值进行修改区间访问:返回该区间的总和问题分析如果通过简单索引操作,“1”的时间复杂度为O(1),“2”的时间复杂度为O(n),其中如果使用一个dp表的方式来存储前n项之和,那么“......