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

题目

给出一棵有根树,问有多少个拓扑序满足 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.mzph.cn/bicheng/59224.shtml

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

相关文章

初始JavaEE篇——多线程(4):wait、notify,饿汉模式,懒汉模式,指令重排序

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 目录 wait、notify 方法 多线程练习 单例模式 饿汉模式 懒汉模式 指令重排序 wait、notify 方法 wait 和 我们前面学习的sleep…

在线预览 Word 文档

引言 随着互联网技术的发展&#xff0c;Web 应用越来越复杂&#xff0c;用户对在线办公的需求也日益增加。在许多业务场景中&#xff0c;能够直接在浏览器中预览 Word 文档是一个非常实用的功能。这不仅可以提高用户体验&#xff0c;还能减少用户操作步骤&#xff0c;提升效率…

C++ 优先算法 —— 查找总价格为目标值的两个商品(双指针)

目录 题目 &#xff1a;查找总价格为目标值的两个商品 1. 题目解析 2. 算法原理 Ⅰ 暴力枚举 Ⅱ 双指针算法 3. 代码实现 暴力枚举 双指针算法 题目 &#xff1a;查找总价格为目标值的两个商品 1. 题目解析 题目截图&#xff1a; 这道题的一个关键的地方&#xff0c;它先…

【操作系统】基于环形队列的生产消费模型

这篇博客的重点在于代码实现&#xff0c;理论部分请看CSDN 一、单生产单消费 1.环形队列的实现 单生产单消费的情况下&#xff0c;我们只需要维护生产者和消费者之间的互斥和同步关系即可 将环形队列封装成一个类&#xff1a;首先给出整体框架&#xff0c;接着会说明每一个…

【Android】Activity组件通信

文章目录 1.使用Intent传递数据2.使用Bundle传递复杂数据3.startActivityForResult 和 onActivityResult4.使用ViewModel共享数据 在Android中&#xff0c;Activity之间的通信是一个常见且重要的任务。以下是一些常用的方法来实现Activity之间的数据传递和通信&#xff1a; 1.使…

如何在Linux环境中的Qt项目中使用ActiveMQ-CPP

文章目录 代码1&#xff1a;消费者代码2&#xff1a;生成者 之前在Linux下的qt程序中使用activeMQ的时候也是用了很多时间去研究&#xff0c;本来想的是好好记录一下&#xff0c;但是当时顾着写代码。很多细节也不想再去走一遍了。大概写一下怎么使用就行了。注意&#xff1a;一…

Qt QCheckBox、QPushButton和QRadioButton详解

QCheckBox&#xff08;复选框&#xff09; 功能&#xff1a;QCheckBox用于创建一个复选框控件&#xff0c;允许用户从多个选项中选择多个。 属性&#xff1a; checkable&#xff1a;决定复选框是否可以被选中或取消选中。checked&#xff1a;表示复选框当前的选中状态&#…

6、显卡品牌分类介绍:技嘉 - 计算机硬件品牌系列文章

技嘉科技是一家以主板、‌显卡在业界缔造无以撼动的地位的科技公司&#xff0c;‌其核心理念是「‌技术创新、‌质量稳定」‌的高标准。‌技嘉专注于关键技术研发&#xff0c;‌其经营范围涵盖家用、‌商用、‌电竞等多元科技领域。‌通过应用突破性的专利技术&#xff0c;‌技…

自编以e为底的指数函数exp,性能接近标准库函数

算法描述&#xff1a; (1). 先做自变量x的范围检查&#xff0c;对于双精度浮点数&#xff0c;自变量不能超出(-1022ln2, 1024ln2)(-708.39, 709.78)&#xff0c;否则exp(x)会溢出。对于单精度浮点数&#xff0c;自变量不能超出(-126ln2, 128ln2)(-87.33, 88.72). 自己使用此函数…

es安装拼音分词后Kibana出现内存错误

出现错误 今天在安装es的拼音分词器&#xff0c;并重启es容器后&#xff0c;登录Kibana无法使用&#xff0c;查询日志发现如下报错 Waiting until all Elasticsearch nodes are compatible with Kibana before starting saved objects migrations... | typelog timestamp2024…

前端react面试基础知识(II)

这些问题涵盖了 React 的很多核心概念和实际应用场景。下面是针对每个问题的详细回答&#xff1a; 1. **React 项目中&#xff0c;如何动态改变组件的 class 来切换样式?** 可以通过条件判断或者状态&#xff08;state&#xff09;来动态改变组件的 class。例如&#xff0c;使…

Day 42 || 完全背包、518. 零钱兑换 II 、 377. 组合总和 Ⅳ、70. 爬楼梯 (进阶)

完全背包 题目链接&#xff1a;卡码网第52题 思路&#xff1a;和之前01背包一样&#xff0c;但是物品可以无限放置&#xff0c;所以之前二维数组中的背包容量是倒序遍历的&#xff0c;现在可以正序遍历即可重复放入。 import java.util.Scanner; public class Main {public …

数据结构-二叉树中的递归

目录 前言 简单手撕二叉树 二叉树节点的求解 二叉树叶子节点的求解 二叉树高度 二叉树第K层节点的个数 二叉树查找值为X的节点 结束语 前言 在这里说声抱歉&#xff0c;好久没更新数据结构了&#xff0c;二叉树的相关内容还没有更新完&#xff0c;是小编的失职&#xff…

在基于AWS EC2的云端k8s环境中 搭建开发基础设施

中间件下载使用helm,这里部署的都是单机版的 aws-ebs-storageclass.yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata:name: aws-ebs-storageclass provisioner: kubernetes.io/aws-ebs parameters:type: gp2 # 选择合适的 EBS 类型&#xff0c;如 gp2、io1…

Apache Calcite - 查询优化之自定义优化规则

RelOptRule简介 为了自定义优化规则&#xff0c;我们需要继承RelOptRule类。org.apache.calcite.plan.RelOptRule 是 Apache Calcite 中的一个抽象类&#xff0c;用于定义优化规则。优化规则是用于匹配查询计划中的特定模式&#xff0c;并将其转换为更优化的形式的逻辑。通过继…

2024网鼎杯青龙组wp:Crypto1

题目 附件内容如下 from Crypto.Util.number import * from secret import flag from Cryptodome.PublicKey import RSAp getPrime(512) q getPrime(512) n p * q d getPrime(299) e inverse(d,(p-1)*(q-1)) m bytes_to_long(flag) c pow(m,e,n) hint1 p >> (51…

Python 单元测试中的 Mocking 与 Stubbing:提高测试效率的关键技术

在软件开发过程中&#xff0c;单元测试是确保代码质量的重要环节。为了实现高效的单元测试&#xff0c;我们常常需要隔离待测试的代码与其外部依赖。这时候&#xff0c;Mocking&#xff08;模拟&#xff09;和 Stubbing&#xff08;桩&#xff09;技术就显得尤为重要。这两种技…

Golang | Leetcode Golang题解之第528题按权重随机选择

题目&#xff1a; 题解&#xff1a; type Solution struct {pre []int }func Constructor(w []int) Solution {for i : 1; i < len(w); i {w[i] w[i-1]}return Solution{w} }func (s *Solution) PickIndex() int {x : rand.Intn(s.pre[len(s.pre)-1]) 1return sort.Searc…

3D打印机 屏幕的固定挂钩断后的一次自己修复经历

引子 3D打印机的屏幕固定挂钩断了 这次确实不知道咋断的&#xff0c;这可咋办呢&#xff0c;到网上看了一下&#xff0c;一个屏幕要2佰多&#xff0c;有些小贵&#xff0c;要不就自己修修吧&#xff0c;打个挂钩按上&#xff0c;说干就干。 正文 freecad的设计图如下【其中各…

PHP合成图片,生成海报图,poster-editor使用说明

之前写过一篇使用Grafika插件生成海报图的文章&#xff0c;但是当我再次使用时&#xff0c;却发生了错误&#xff0c;回看Grafika文档&#xff0c;发现很久没更新了&#xff0c;不兼容新版的GD&#xff0c;所以改用了intervention/image插件来生成海报图。 但是后来需要对海报…