ICPC南京 C.拓扑 + 组合数Dp

news2024/11/5 17:25:28

题目

给出一棵有根树,问有多少个拓扑序满足 p i = i p_i=i pi=i n ≤ 5000 n\leq 5000 n5000

样例

input1:
4
1 1 2
output1:
3 2 1 2
input2:
9
1 1 2 2 3 3 4 4 5
output2:
672 420 180 160 152 108 120 170 210

题解

考虑设 f[x][i] 表示还未在序列中插入 x 子树内除了 x 外的其他节点,满足 p x = i p_x=i px=i 的拓扑序个数。
那么对于某一个点 x ,答案就是 f[x][x]*C(n-x,sz[x]-1)*g[x]
其中 C(n-x,sz[x]-1) 表示 sz[x]-1 个元素只能放在位置 x 的后面。
g[x] 表示的是 x 的子树的拓扑序个数,这个可以一遍 dfs 轻松得到。

考虑 f[x][i]f[y][j] 的转移:
发现除了 x 的子树外,其他所有 n-sz[x]+1 个点(包括 x)的拓扑序已经确定好了,现在要转移到 f[y][j] ,所以我们要先将 y 所在的子树剔除掉(n-sz[y]),然后再将 x 的其余旁支加进 x 的拓扑序后面(注意是位置 i,所以总共的位置是 n-sz[y]-i)。
那么转移系数就是
( n − s z [ y ] − i s z [ y 1 ] , s z [ y 2 ] , . . . , s z [ y k − 1 ] , n − s z [ y ] − i − ∑ i = 1 k − 1 s z [ y i ] ) \binom{n-sz[y]-i}{sz[y_1],sz[y_2],...,sz[y_{k-1}],n-sz[y]-i-\sum_{i=1}^{k-1}sz[y_i]} (sz[y1],sz[y2],...,sz[yk1],nsz[y]ii=1k1sz[yi]nsz[y]i)
其中 y 1 , . . . y k − 1 y_1,...y_{k-1} y1,...yk1 表示 x 节点的其他儿子。
其实最后的一个式子恰好就是 x 祖先的其他旁支在位置 i 之后的点数。
然后再将 y 节点自然插入到第 j 个位置,这里并不需要乘任何系数,当 j > i j>i j>i 就可以转移,所以使用前缀和优化即可。


#include<bits/stdc++.h>
using namespace std;

const int N=5010,mod=998244353;
int T,fac[N],inv[N],n,sz[N],fin[N],f[N][N],g[N];
int ans[N];
vector<int> V[N];

int ksm(int x,int t){
    int tot=1;
    while(t){
        if(t&1) tot=1ll*tot*x%mod;
        x=1ll*x*x%mod;
        t>>=1;
    }
    return tot;
}

int C(int x,int y){
    return 1ll*fac[x]*inv[y]%mod*inv[x-y]%mod;
}

void dfs(int x){
    sz[x]=0;g[x]=1;
    for(auto y:V[x]){
        dfs(y);
        sz[x]+=sz[y];
        g[x]=1ll*g[x]*g[y]%mod*C(sz[x],sz[y])%mod;
    }
    sz[x]++;
}

void gs(int x){
    // printf("%d:\n",x);
    // for(int i=1;i<=n;i++) printf("%d ",f[x][i]);printf("\n");
    ans[x]=1ll*f[x][x]*C(n-x,sz[x]-1)%mod*g[x]%mod;
    int prod=1;
    for(auto y:V[x]) prod=1ll*prod*inv[sz[y]]%mod*g[y]%mod;
    for(auto y:V[x]){
        prod=1ll*prod*fac[sz[y]]%mod*ksm(g[y],mod-2)%mod;
        for(int i=1;i<=n-sz[x]+1;i++){
            f[y][i+1]=(f[y][i]+1ll*f[x][i]*fac[n-sz[y]-i]%mod*prod%mod*inv[n-i-sz[x]+1])%mod;
            // printf("%d\n",f[y][i+1]);
        }
        for(int i=n-sz[x]+2;i<n;i++) f[y][i+1]=f[y][i];
        gs(y);
        prod=1ll*prod*inv[sz[y]]%mod*g[y]%mod;
    
    }
}                       

int main(){
    //scanf("%d",&T);
    scanf("%d",&n);
    fac[0]=1;for(int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%mod;
    inv[n]=ksm(fac[n],mod-2);for(int i=n-1;i>=0;i--) inv[i]=1ll*inv[i+1]*(i+1)%mod;
    for(int i=1;i<=n;i++) fin[i]=1ll*fac[i]*inv[i-1]%mod;
    int x;
    for(int i=1;i<=n;i++) V[i].resize(0);
    for(int i=2;i<=n;i++) scanf("%d",&x),V[x].push_back(i); 
    f[1][1]=1;
    dfs(1);
    gs(1);
    for(int i=1;i<=n;i++) printf("%d ",ans[i]);printf("\n");
}

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

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

相关文章

02- 模块化编程-003 LCD1602液晶显示时间与日期

1、液晶显示电路 2、电路原理简介 1. 电路组件与功能 PIC单片机&#xff08;PIC16F887&#xff09;&#xff1a; 主控制器&#xff0c;负责处理输入输出。 LCD显示屏&#xff08;LM061&#xff09;&#xff1a; 驱动数码管显示器&#xff0c;以显示时间和日期信息。 支持多个段…

conda下jupyterlab安装问题以及交互绘图问题记录

安装 1. 直接conda install jupyterlab就好&#xff0c;只要在base环境下安装就行&#xff0c;可以在任意环境下执行jupyter lab启动。 2. 打开jupyter lab后显示Could not determine jupyterlab build status without nodejs&#xff0c;可以执行conda install nodejs安装no…

华为OD机试 - 预订酒店(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;E卷D卷A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加…

LM Head weights;ChatGPT-3词汇量:175,000;llama7b 词汇量,词嵌入维度:4096

目录 LM Head weights ChatGPT-3词汇量:175,000 llama7b 词汇量 词汇量:32000 max_position_embeddings: 4096 LM Head weights ChatGPT-3词汇量:175,000 ChatGPT-4 确切的词向量种类数量公开信息。但可以根据一些语言模型的相关知识进行推测分析。 一般来说,语言模…

极简实现酷炫动效:Flutter隐式动画指南第二篇之一些酷炫的隐式动画效果

目录 前言 1.弹性放大按钮效果 2.旋转和缩放组合动画 3.颜色渐变背景动画 4.缩放进出效果 前言 在上一篇文章中&#xff0c;我们介绍了Flutter中的隐式动画的一些相关知识&#xff0c;在这篇文章中,我们可以结合多个隐式动画 Widget 在 Flutter 中创建一些酷炫的视觉效果&…

【ONLYOFFICE 文档 8.2 版本深度测评】功能革新与用户体验的双重飞跃

引言 在数字化办公的浪潮中&#xff0c;ONLYOFFICE 文档以其强大的在线协作功能和全面的办公套件解决方案&#xff0c;赢得了全球用户的青睐。随着 8.2 版本的发布&#xff0c;ONLYOFFICE 再次证明了其在办公软件领域的创新能力和技术实力。 一.协作编辑 PDF&#xff1a;团队合…

高频电子线路---倍频器与振荡器

目录 倍频电路原理 丙类倍频器原理电路 问题: 提升滤波方法: 导通角 振荡器 振荡器基本工作原理 首先是怎么维持 那么如何振荡呢? 思考题: 组成要素 振荡器的起振条件 平衡条件 要点提示 稳定条件 振幅平衡 硬激励起振时: 稳定条件 相位平衡 倍频电路原理 简单原理 : …

自杀一句话木马(访问后自动删除)

在做安全测试时&#xff0c;例如文件上传时就要上传可以解析的脚本文件解析证明存在漏洞&#xff0c;这个时候就需要(访问后自动删除文件的一句话木马) PHP <?php echo md5(1);unlink(__FILE__); ?> 访问后自动删除

Windows配置Nodejs及nmp简明教程(2024可用)

一、下载及安装Nodejs 下载 Node.js 中文网 (nodejs.com.cn)在此下载windows长期维护版本的.msi安装包&#xff0c;64位 安装&#xff1a; 双节安装包一直点击Next下一步&#xff0c;注意安装路径选择C盘默认路径&#xff08;C:\Program Files\nodejs\&#xff09;即可&#x…

使用ffmpeg和mediamtx模拟多通道rtsp相机

首先下载ffmpeg&#xff0c;在windows系统上直接下载可执行文件&#xff0c;并配置环境变量即可在命令行当中调用执行。 下载地址&#xff1a; https://ffmpeg.org/再在github上下载mediamtx搭建rtsp服务器&#xff0c;使用ffmpeg将码流推流到rtsp服务器。 下载地址&#xff1…

Unreal5从入门到精通之如何在VR中使用3DUI

文章目录 前言创建3DUI1.新建控件蓝图2.添加控件到画布上3.新建Actor蓝图MyUIActor4.添加控件组件Widget5.设置控件类和画布大小6.创建MyUIActor实例到场景中3DUI和VR射线交互1.添加按钮的点击事件2.设置MyUIActor碰撞响应3.VRPawn添加控件交互组件4.添加手柄Trigger点击事件绑…

ai数字人分身123口播克隆数字人小程序源码_博纳软云

功能配置 一、用户 用户管理小黑屋用户反馈登录设置短信参数 二、作品 视频作品背景音乐库背景音乐分类 三、形象分身 上传记录视频要求参数配置 四、声音克隆 克隆记录参数配置声音要求文案示例 五、AI文案 生成记录创作模型模型分类Al配置 六、充值 充值订单积分套…

活动回顾丨艾体宝《开源软件供应链安全的最佳实践》线下研讨会圆满落幕!

10月&#xff0c;艾体宝联合Mend成功举办了一场主题为“开源软件供应链安全最佳实践”的研讨会。此次活动吸引了众多业内专家、技术领袖和企业代表参与&#xff0c;共同探讨在当今数字化转型浪潮中&#xff0c;企业如何应对开源软件供应链安全的挑战。会议围绕三大核心议题展开…

java项目之校园周边美食探索及分享平台(springboot)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的校园周边美食探索及分享平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 校园周边美食…

esp32cam+Arduino IDE在编译时提示找不到 esp_camera.h 的解决办法

多半是因为你的ESP32库升级了&#xff0c;不再是 1.02版本&#xff0c;或者根本就没有 ESp32 库。如果被升级了&#xff0c;还原为1.02版本就可以了。如果没有&#xff0c;按照下述方法添加&#xff1a; 首先&#xff0c;在"文件"->"首选项"->"…

Rust 力扣 - 1461. 检查一个字符串是否包含所有长度为 K 的二进制子串

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 长度为k的二进制子串所有取值的集合为[0, sum(k)]&#xff0c;其中sum(k)为1 2 4 … 1 << (k - 1) 我们只需要创建一个长度为sum(k) 1的数组 f &#xff0c;其中下标为 i 的元素用来标记字符串中子串…

Edit Data. Create Cell Editors. Validate User Input 编辑数据。创建 Cell Editors。验证用户输入

Goto Data Grid 数据网格 Edit Data. Create Cell Editors. Validate User Input 编辑数据。创建 Cell Editors。验证用户输入 Get and Modify Cell Values in Code 在代码中获取和修改单元格值 仅当 Grid 及其列已完全初始化时&#xff0c;才使用以下方法。如果需要在表单仍…

网络:ARP的具体过程和ARP欺骗

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言ARP具体过程ARP欺骗原理总结 前言 本文仅作为ARP具体过程和ARP欺骗的知识总结 硬件类型 &#xff1a;指定发送和接受ARP包的硬件类型&am…

一:Linux学习笔记(第一阶段)-- 安装软件 vmware workstation 虚拟机软件 centos系统

目录 学习计划&#xff1a; 资源准备 虚拟机软件&#xff1a;就别自己找了 现在换网站了 下载比较费劲 Centos8&#xff1a; 阿里云镜像地址下载&#xff08;下载比较版 但是有不同版本&#xff09;&#xff1a;centos安装包下载_开源镜像站-阿里云 百度网盘地址&#xff…

在Ubuntu上安装TensorFlow与Keras

文章目录 1. 查看系统和Python版本信息1.1 查看Ubuntu版本信息1.2 查看Python版本信息 2. 安装pip2.1 下载get-pip.py2.2 运行get-pip.py2.3 查看pip版本 3. 安装Jupyter Notebook3.1 安装Jupyter Notebook3.2 运行Jupyter Notebook3.3 安装jupyter-core3.4 配置Jupyter Notebo…