令$b_{a_{i}}=i$,那么问题即要求$i$不是$b_{i}$的祖先,也即$b_{i}$不严格在$i$的子树中

显然$a_{i}$和$b_{i}$一一对应,因此我们不妨统计$b_{i}$的个数

考虑容斥,令$f(S)$为$\forall i\in S,b_{i}$严格在$i$子树中的排列数,根据容斥答案即$\sum_{S\subseteq [1,n]}(-1)^{|S|}f(S)$

关于$f(S)$,可以从底往上依次确定$i\in S$的$b_{i}$,方案数即$\prod_{i\in S}sz_{i}-\sum_{x\in S且x在i的子树中}1$(其中$sz_{i}$为$i$的子树大小),最后对于$i\not\in S$的$b_{i}$没有限制,即$(n-|S|)!$种

对于后者,可以在树形dp中记录,即令$f_{i,j}$表示以$i$为根的子树中$\sum_{x\in S且x在i的子树中}1=j$的排列数,最终不难得到答案即$\sum_{i=1}^{n}(-1)^{i}(n-i)!f_{1,i}$

转移方程即$f_{i,j+k}=\sum f_{i,j}f_{son,k}$,最终再将$i$加入$S$,即$f_{i,j}=f_{i,j}+(sz_{i}-j)f_{i,j-1}$

时间复杂度为$o(n^{2})$,可以通过

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 2005
4 #define mod 998244353
5 struct Edge{
6 int nex,to;
7 }edge[N];
8 int E,n,x,ans,head[N],sz[N],g[N],f[N][N];
9 void add(int x,int y){
10 edge[E].nex=head[x];
11 edge[E].to=y;
12 head[x]=E++;
13 }
14 void dfs(int k){
15 f[k][0]=1;
16 for(int i=head[k];i!=-1;i=edge[i].nex){
17 dfs(edge[i].to);
18 memcpy(g,f[k],sizeof(g));
19 memset(f[k],0,sizeof(f[k]));
20 for(int j=0;j<=sz[k];j++)
21 for(int l=0;l<=sz[edge[i].to];l++)f[k][j+l]=(f[k][j+l]+1LL*g[j]*f[edge[i].to][l])%mod;
22 sz[k]+=sz[edge[i].to];
23 }
24 sz[k]++;
25 for(int i=sz[k];i;i--)f[k][i]=(f[k][i]+1LL*(sz[k]-i)*f[k][i-1])%mod;
26 }
27 int main(){
28 scanf("%d",&n);
29 memset(head,-1,sizeof(head));
30 for(int i=2;i<=n;i++){
31 scanf("%d",&x);
32 add(x,i);
33 }
34 dfs(1);
35 for(int i=0;i<=n;i++){
36 int s=1;
37 if (i&1)s=mod-1;
38 for(int j=1;j<=n-i;j++)s=1LL*s*j%mod;
39 ans=(ans+1LL*s*f[1][i])%mod;
40 }
41 printf("%d",ans);
42 }

[atARC121E]Directed Tree的更多相关文章

  1. HDOJ 3516 Tree Construction

    四边形优化DP Tree Construction Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  2. gym 100589A queries on the Tree 树状数组 + 分块

    题目传送门 题目大意: 给定一颗根节点为1的树,有两种操作,第一种操作是将与根节点距离为L的节点权值全部加上val,第二个操作是查询以x为根节点的子树的权重. 思路: 思考后发现,以dfs序建立树状数 ...

  3. hdu3516 Tree Construction

    Problem Description Consider a two-dimensional space with a set of points (xi, yi) that satisfy xi & ...

  4. CodeForces 1062E Company

    Description The company \(X\) has \(n\) employees numbered from \(1\) through \(n\). Each employee \ ...

  5. CHANGE DETECTION IN ANGULAR 2

    In this article I will talk in depth about the Angular 2 change detection system. HIGH-LEVEL OVERVIE ...

  6. Codechef Dynamic Trees and Queries

    Home » Practice(Hard) » Dynamic Trees and Queries Problem Code: ANUDTQSubmit https://www.codechef.co ...

  7. Codeforces Round #603 (Div. 2) F. Economic Difficulties dp

    F. Economic Difficulties An electrical grid in Berland palaces consists of 2 grids: main and reserve ...

  8. [hdu6990]Directed Minimum Spanning Tree

    模板题:在有向图中,对每一个点求以其为根的最小(外向)生成树 (当图是强连通时)可以使用朱刘算法,算法过程如下: 1.对每一个节点,选择指向该点的边权最小的边,即得到一张子图 2.任选这张子图的一个简 ...

  9. Is It A Tree?[HDU1325][PKU1308]

    Is It A Tree? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

随机推荐

  1. 基于nginx实现私有yum仓库

    基于本地光盘的源 server端IP:10.0.0.79 nginx使用默认路径.端口 yum install nginx -y #更改以root运行 sed -i '/^user/s/nginx/r ...

  2. 小白自制Linux开发板 四. 通过SPI使用ESP8266做无线网卡

    本文章基于 WhyCan Forum(哇酷开发者社区) https://whycan.com/t_4149.htmlhttps://whycan.com/t_5870.html整理而成. 为了尊重原作 ...

  3. FastAPI 学习之路(十)请求体的字段

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...

  4. DL4J实战之六:图形化展示训练过程

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇是<DL4J实战>系列的第六 ...

  5. 如何快速体验鸿蒙全新声明式UI框架ArkUI?

    HDC2021将于10月22日在东莞松山湖正式开幕,大会将设立Codelab体验专区,超多好玩.有趣的Demo等你体验.想快速入门HarmonyOS?学习HarmonyOS新特性?以下几个Codela ...

  6. for...in和Object.keys()区别

    区别: for in 用来枚举对象的属性,某些情况下,可能按照随机顺序遍历数组元素 object.keys() 可以返回对象属性为元素的数组,数组中属性名顺序和for in比那里返回顺序一样 ---f ...

  7. SharkCTF2021 pwn“初见”1

    (无内鬼 今日不想学了 水一篇) nc nc nc easyoverflow Intoverflow

  8. Java:重载和重写

    Java:重载和重写 对 Java 中的 重载和重写 这个概念,做一个微不足道的小小小小结 重载 重载:编译时多态,同一个类中的同名的方法,参数列表不同,与返回值无关. 有以下几点: 方法名必须相同: ...

  9. ClickHouse实战

    1.概述 最近有被留言关于ClickHouse的使用问题,今天笔者将为大家分享一下ClickHouse的安装细节和使用方法. 2.内容 首先安装环境如下所示: Linux:CentOS7 ClickH ...

  10. python re:正向肯定预查(?=)和反向肯定预查(?<=)

    参考资料:https://tool.oschina.net/uploads/apidocs/jquery/regexp.html (?=pattern) 正向肯定预查,在任何匹配pattern的字符串 ...