ARC121E Directed Tree
ARC121E Directed Tree
有意思的容斥加树 dp。
思路
\(a_i\) 可以是除去 \(i\) 祖先之外的所有点,考虑 \(a_i\) 的逆排列。
每一个 \(i\) 在正排列里都可以被不是自己子树内的点选择,那么逆排列里 \(i\) 不可以放自己子树内的点(不包括自己)。
现在转换求逆排列的方案数。
考虑容斥,设 \(g_i\) 为有 \(i\) 个位置不合法的方案数。
有 \(ans=\sum_{i=0}^n (-1)^ig_i(n-i)!\)。
\((n-i)!\) 有 \(n-i\) 个位置可以随便放 \(n-i\) 个数。
求 \(g_i\) 考虑树 dp,设 \(f_{u,i}\) 为 \(u\) 子树内有 \(i\) 个点不合法的方案数(只考虑不合法的点)。
因为 \(u\) 的不同子树,不合法的范围不相交,有:
\]
\(v,v'\) 是 \(u\) 的儿子。
但这时求出来的 \(f_u\) 是 \(u\) 没选择的结果,加上 \(u\) 位置的选择:
\]
有 \(sz_u-1\) 个点可选,\(i-1\) 个点被选了。
那么 \(g_i=f_{1,i}\)。
时间复杂度 \(O(n^2)\)。
CODE
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 998244353
const int maxn=2e3+5;
int n;
int siz[maxn];
ll ans;
ll fac[maxn],f[maxn][maxn],g[maxn];
vector<int>E[maxn];
void dfs(int u)
{
f[u][0]=1,siz[u]=1;
for(auto v:E[u]) dfs(v);
for(auto v:E[u])
{
for(int i=0;i<=siz[u]+siz[v];i++) g[i]=0;
for(int i=0;i<=siz[u];i++) for(int j=0;j<=siz[v];j++) g[i+j]=(g[i+j]+f[u][i]*f[v][j]%mod)%mod;
for(int i=0;i<=siz[u]+siz[v];i++) f[u][i]=g[i];
siz[u]+=siz[v];
}
for(int i=siz[u];i>=1;i--) f[u][i]=(f[u][i]+f[u][i-1]*(siz[u]-i)%mod)%mod;
}
int main()
{
scanf("%d",&n);
fac[0]=1;
for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i%mod;
for(int i=2;i<=n;i++)
{
int x;
scanf("%d",&x);
E[x].push_back(i);
}
dfs(1);
for(int i=0;i<=n;i++) f[1][i]=f[1][i]*fac[n-i]%mod;
for(int i=0;i<=n;i++)
{
ll k=1;
if(i&1) k=-1;
ans=(ans+k*f[1][i])%mod;
}
printf("%lld",(ans+mod)%mod);
}
ARC121E Directed Tree的更多相关文章
- [atARC121E]Directed Tree
令$b_{a_{i}}=i$,那么问题即要求$i$不是$b_{i}$的祖先,也即$b_{i}$不严格在$i$的子树中 显然$a_{i}$和$b_{i}$一一对应,因此我们不妨统计$b_{i}$的个数 ...
- HDOJ 3516 Tree Construction
四边形优化DP Tree Construction Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- gym 100589A queries on the Tree 树状数组 + 分块
题目传送门 题目大意: 给定一颗根节点为1的树,有两种操作,第一种操作是将与根节点距离为L的节点权值全部加上val,第二个操作是查询以x为根节点的子树的权重. 思路: 思考后发现,以dfs序建立树状数 ...
- hdu3516 Tree Construction
Problem Description Consider a two-dimensional space with a set of points (xi, yi) that satisfy xi & ...
- CodeForces 1062E Company
Description The company \(X\) has \(n\) employees numbered from \(1\) through \(n\). Each employee \ ...
- CHANGE DETECTION IN ANGULAR 2
In this article I will talk in depth about the Angular 2 change detection system. HIGH-LEVEL OVERVIE ...
- Codechef Dynamic Trees and Queries
Home » Practice(Hard) » Dynamic Trees and Queries Problem Code: ANUDTQSubmit https://www.codechef.co ...
- 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 ...
- [hdu6990]Directed Minimum Spanning Tree
模板题:在有向图中,对每一个点求以其为根的最小(外向)生成树 (当图是强连通时)可以使用朱刘算法,算法过程如下: 1.对每一个节点,选择指向该点的边权最小的边,即得到一张子图 2.任选这张子图的一个简 ...
- 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 ...
随机推荐
- zabbix功能应用
一.zabbix简介 1.zabbix概述 zabbix:是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案,能够监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通 ...
- C程序起点main函数
C程序起点main函数 main c语言中main函数接收两个参数int argc, char* argv[] int main(int argc, char* argv[]); int main(i ...
- .net7(.net core) 依赖注入:从 AddSingleton 注册的类里面访问 AddScoped 的问题
记录一下以免忘记. 今天从NopCommerce开源项目里面把它的任务调度类拆出来到我的项目用的时候,发现报错,报错信息如下 Some services are not able to be cons ...
- 【YashanDB知识库】YashanDB的JDBC/OCI驱动如何设置字符编码
问题现象 Oracle.Mysql数据库链接串,JDBC驱动连接串可以指定客户端的编码格式: jdbc:mysql://hostname:port/database_name?useUnicode=t ...
- 如何保证 Redis 的高并发和高可用?讨论redis的单点,高可用,集群
如何保证 Redis 的高并发和高可用?讨论redis的单点,高可用,集群. 打开GitHub搜索redis,边可以看到,该项目的介绍是这样的: Redis is an in-memory datab ...
- 欢迎加入d3shop,一个DDD实战项目
背景 整个<老肖的领域驱动设计之路>系列关于认知的核心部分已经基本闭环,但纸上得来终觉浅,还是需要通过实际操作来体会和验证我们的观点,接下来,我将通过一个实战项目来带着大家一起体验从需求到 ...
- BOM – 操作 Query
前言 ASP.NET Core 写过一篇关于操作 query 的 ASP.NET Core – 操作 Uri 和 Query. 前端偶尔也会需要做出 query. URLSearchParams 之前 ...
- [namespace hdk] 64位 bitset
功能 已重载运算符 [](int) (右值,修改请使用 set() 方法) ~() +(bitset) +(unsigned long long) +=(bitset) +=(unsigned lon ...
- 【赵渝强老师】MySQL高可用架构:MHA
MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating master failover 功能.MHA 在监控到 master 节 ...
- uprobe的使用浅析
uprobe是linux内核提供的一种trace用户态函数的机制 可以在不对二进制重新编译的情况下进行trace特定函数 本文描述了uprobe的基本使用方法 使用方法 官方的指引是这样的, 详细的可 ...