【树形DP+可重集排列】至至子的公司排队

news2024/9/23 13:18:37

好屌的题

F-至至子的公司排队_牛客小白月赛55 (nowcoder.com)

题意:

思路:

其实题目问的就是,森林的拓扑序有几种

那么我们先去考虑一棵树的拓扑序有几种

这个可以用树形DP来解决

设dp[u]为,以u为根的子树的拓扑序的种类数,然后去考虑它的子树

关于计数类的树形DP,都可以把一棵子树的所有状态想象成一列,然后多棵子树进行匹配(乘法原理)

 对于这道题,答案就是这样的:

 

 先是乘法原理把所有儿子的dp值乘起来,然后注意到对于同一棵子树的拓扑序而言,顺序是确定的,因此同一棵子树的拓扑序可以看作是同一颜色的,因此可以看成是可重集排列

这点很重要,我根本没想到这点qwq

那么森林的方案数怎么求呢?其实就是把这么多棵树看作子树,再求一下可重集排列即可

Code:

#include <bits/stdc++.h>

#define int long long

using namespace std;

using i64 = long long;

const int mxn=1e5+10;
const int mxe=1e5+10;
const int mod=1e9+7;

int N,n,x,tot=0,ans=1,sum=0;
int Fac[mxn],inv[mxn];
int head[mxn],sz[mxn],dp[mxn];

struct ty{
    int to,next;
}edge[mxe<<2];

int ksm(int a,int b,int mod){
    int res=1;
    while(b){
        if(b&1) res=(res*a)%mod;
        a=(a*a)%mod;
        b>>=1;
    }
    return res;
}
void F_init(){
    Fac[0]=1ll;
    for(int i=1;i<mxn;i++) Fac[i]=(Fac[i-1]*i)%mod;
    inv[0]=1;
    inv[mxn-1]=ksm(Fac[mxn-1],mod-2,mod);
    for(int i=mxn-2;i>=1;i--) inv[i]=inv[i+1]*(i+1)%mod;
}
void add(int u,int v){
    edge[tot].to=v;
    edge[tot].next=head[u];
    head[u]=tot++;
}
void G_init(){
    tot=0;
    for(int i=0;i<=n+10;i++){
        head[i]=-1;
        sz[i]=dp[i]=0;
    }
}
void dfs(int u,int fa){
    sz[u]=1;
    dp[u]=1;
    for(int i=head[u];~i;i=edge[i].next){
        if(edge[i].to==fa) continue;
        dfs(edge[i].to,u);
        sz[u]+=sz[edge[i].to];;
        dp[u]=(dp[u]*dp[edge[i].to])%mod;
        dp[u]=(dp[u]*inv[sz[edge[i].to]])%mod;
    }
    dp[u]=(dp[u]*Fac[sz[u]-1])%mod;
}
void solve(){
    cin>>N;
    for(int i=1;i<=N;i++){
        cin>>n;
        G_init();
        sum+=n;
        for(int j=2;j<=n;j++){
            cin>>x;
            add(j,x);
            add(x,j);
        }
        dfs(1,0);
        ans=(ans*dp[1]%mod*inv[n])%mod;
    }
    ans=(ans*Fac[sum])%mod;
    cout<<ans<<'\n';
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int __=1;//cin>>__;
    F_init();
    while(__--)solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/658818.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java】项目中大批量数据查询导致OOM

文章目录 背景内存溢出的具体原因错误模拟问题复现解决办法流式查询和分页查询的使用场景查询数据的建议 背景 项目中有时候一次性将大批量数据都查出来到内存中导致内存占用过多很可能会导致内存溢出 内存溢出的具体原因 在JVM内存结构中分为以下几个模块 程序计数器虚拟机…

SSL协议,一文带你了解

SSL简介 SSL&#xff08;Secure Sockets Layer&#xff09;是一种安全协议&#xff0c;用于保护互联网上的数据传输安全。SSL协议最初由网景公司开发&#xff0c;现在已经被TLS&#xff08;Transport Layer Security&#xff09;协议所取代。SSL协议和TLS协议都是为了保护数据传…

一文带你弄懂【时间复杂度】

文章目录 算法时间复杂度时间复杂度计算常见的时间复杂度时间复杂度的差异 总结 算法 算法&#xff08;Algorithm&#xff09;是求解一个问题需要遵循的&#xff0c;被清楚指定的简单指令的集合。 一个算法的评价主要从时间复杂度和空间复杂度来考虑。而时间复杂度是一个函数…

Netty核心技术四--Netty概述

1. 原生NIO存在的问题 NIO 的类库和 API 繁杂&#xff0c;使用麻烦&#xff1a;需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等。需要具备其他的额外技能&#xff1a;要熟悉 Java 多线程编程&#xff0c;因为NIO编程涉及到Reactor模式&#xff0c;…

从tomcat说起全面理解Java web开发原理

从tomcat说起全面理解Java web开发原理 简介&#xff1a;Java开发分为Java ME&#xff0c;Java SE&#xff0c;Java EE。回顾过去这些的开发工作基本上都是围绕着Java EE的&#xff0c;在开发经历中分别经历了Java EE开发框架从jsp servlet一路经历了ssh&#xff0c; ss…

存储笔记8 ipsan

Module Objectives IP SAN的组件 IP SAN的好处 描述SAN中的IP融合及其影响 描述的基本架构 –iSCSI –FCIP –FCoE 讨论IP SAN技术的市场驱动因素 列出IP SAN技术 列出iSCSI的组件和连接选项 描述iSCSI体系结构和拓扑结构 解释iSNS操作 描述FCIP的体系结构 IP SAN互联…

Springboot整合第三方登录

文章目录 Springboot整合第三方登录为什么采用第三方登录整合第三方登录创建应用导入依赖创建controller类 Springboot整合第三方登录 为什么采用第三方登录 ​ 采用第三方登录可以避免重新注册账号的繁琐&#xff0c;也不需要再为密码和昵称发愁&#xff0c;而第三方登录有一…

Linux命令——top相关之Load Average平均负载

Linux 平均负载 Load Average 详解_系统1f分钟负载_欧晨eli的博客-CSDN博客 一、什么是Load Average&#xff1f; 系统负载&#xff08;System Load&#xff09;是系统CPU繁忙程度的度量&#xff0c;即有多少进程在等待被CPU调度&#xff08;进程等待队列的长度&#xff09;。…

2-JVM运行流程

JVM 是 Java 运行的基础&#xff0c;也是实现一次编译到处执行的关键&#xff0c;那么 JVM 是如何执行的呢&#xff1f; 程序在执行之前先要把java源代码&#xff08;.java&#xff09;转换成字节码文件&#xff08;.class&#xff09;。JVM 首先需要通过一定的方式类加载器&a…

如何做好前端性能优化

前端推荐官网: http://luckycola.com.cn/ 前言: 前端性能优化一直是一个前端开发人员必须关注的经典话题,虽然现在随着技术的不断发展,网页容器(浏览器、webview)性能也越来越强大,但是网站应用的功能也不断丰富,体积不可避免的增加,当网络环境等因素不好时,仍然会存在白屏时…

【后端面经】MySQL主键、唯一索引、联合索引的区别和作用

【后端面经】MySQL主键、唯一索引、联合索引的区别和作用 0. 简介1. 主键2. 唯一索引3. 联合索引4. 索引对数据库操作的影响5. 其他索引5.1 普通索引5.2 全文索引5.3 前缀索引 6. 总结7. 参考资料 0. 简介 索引是一类特殊的文件&#xff0c;用来存储检索信息&#xff0c;使数据…

数值天气预报期末复习

数值天气预报期末复习 文章目录 数值天气预报期末复习&#xff08;零&#xff09;重点需要掌握知识点&#xff08;一&#xff09;什么是数值天气预报&#xff08;二&#xff09;数值模式的分类&#xff08;三&#xff09;各坐标系下的大气运动方程组3.1 局地直角坐标系3.2 球坐…

绩效跃升地图读书笔记20130618

绩效跃升地图&#xff0c;从5月份开始看&#xff0c;每天中午吃完饭休息的时候&#xff0c;坐在工位上&#xff0c;把看手机刷视频看八卦的时间&#xff0c;换成看书的时间&#xff0c;直到6月15日看完一本书。发现其实利用好碎片时间&#xff0c;还是可以读不少书的。 “绩效…

网络端口地址转换 NAPT 配置

你是某公司的网络管理员&#xff0c;公司办公网需要接入互联网&#xff0c;公司只向 ISP 申请了一条专线&#xff0c;该专线分配了一个公司 IP 地址&#xff0c;配置实现全公司的主机都能访问外网。 技术原理 NAT 将网络划分为内部网络和外部网络两部分&#xff0c;局域网主机…

Java集合详解

目录 友情提醒第一章、集合体系概述1.1&#xff09;集合是什么&#xff1f;与数组的区别在哪1.2&#xff09;集合体系与分类 第二章、集合体系中的Collection和List接口/Set接口2.0&#xff09;List接口/Set接口两者区别2.1&#xff09;Collection接口中的常用方法2.2&#xff…

【系统开发】尚硅谷 - 谷粒商城项目笔记(一):项目准备工作

文章目录 项目准备工作人人开源搭建后台管理系统数据库搭建前端项目搭建后端模块代码生成 项目准备工作 人人开源搭建后台管理系统 码云搜索人人开源 renren-fast-vue&#xff1a;前端 renren-generator&#xff1a;代码生成器 renren-fast&#xff1a;后台管理系统 用git…

系统设计蓝图:终极指南

系统设计蓝图&#xff1a;终极指南 设计开发一个健壮的、可扩展的、高效的系统可以是令人望而生畏. 但是&#xff0c;了解关键概念和组件可以使流程更易于管理。在这篇博文中&#xff0c;我们将探索基本的系统设计组件&#xff0c;例如 DNS、负载平衡、API 网关等&#xff0c;以…

python详解(7)——进阶(1):排序算法

目录 &#x1f3c6;一、前言 &#x1f3c6;二、什么是算法&#xff08;简单&#xff09; &#x1f6a9;1、算法 &#x1f6a9;2、排序算法 &#x1f3c6;三、冒泡排序&#xff08;中等&#xff09; &#x1f3c6;四、快速排序&#xff08;困难&#xff09; &#x1f3c6;五&…

Android Studio 提高SDK下载速度

我们在下载Android SDK的时候&#xff0c;经常会出现下载失败的情况&#xff0c; 报android sdk manager not installing components之类的错误。 要如何加快SDK的下载速度呢 ? 我们可以通过修改Host来实现 关闭Android Studio的代理 首先&#xff0c;我们要关闭Android Stu…

华为HCIA备考 易错题整理 PART1

1.IEEE802.1Q定义的 VLAN 帧格式中VLAN ID总共有多少bit 答&#xff1a;12 2.NAPT允许多个私有IP地址通过不同的端口号映射到同一个公有IP地址上&#xff0c;且不需要做任何关于端口号的配置。 3.IEEE802.1Q定义的VLAN帧总长度为多少字节&#xff1f; 答&#xff1a;4 4.关于…