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 ...
随机推荐
- 【Appium】之自动化定位总结
一.同级定位时,先定位上级 我想定位[必填]框,我先定位[姓名]的同一个上级 self.driver.find_element(MobileBy.XPATH,"//*[contains(@t ...
- 西瓜杯 WP
RE 一个西瓜切两半你一半我一半 有点谜语,文本给的是输出和key # Visit https://www.lddgo.net/string/pyc-compile-decompile for mor ...
- HBuilder X在4K显示器怎么设置HBuilderX窗口本身的字体大小
在使用HBuilder X编辑器的时候,使用笔记本自身的显示器,编辑器窗口本身的字体大小都正好,但是将HBuilder X编辑器用在外接显示器(高清)或者4K显示器上的时候,就不行了.怎么解决呢? 在 ...
- SQL SEVER CDC 启动和关闭 操作说明
什么是变更数据捕获 (CDC)? 变更数据捕获使用 SQL Server 代理记录表中发生的插入.更新及删除. 因此,它使得可以通过关系格式轻松使用这些数据更改. 将为修改的行捕获将这些更改数据应用到 ...
- JavaScript – Proxy
参考 阮一峰 – Proxy 介绍和使用 Proxy 的作用是代理对象, 消费者不直接使用对象, 而是使用代理对象. 一般上做代理的目的就是想拦截对象访问做一些别的事情. 比如当对象改变以后, 同步 ...
- .NET全局静态可访问IServiceProvider(支持Blazor)
DependencyInjection.StaticAccessor 前言 如何在静态方法中访问DI容器长期以来一直都是一个令人苦恼的问题,特别是对于热爱编写扩展方法的朋友.之所以会为这个问题苦恼,是 ...
- 现在用 ChatGPT,要达到最好效果,建议加入以下提示词:
take a deep breath 深呼吸 think step by step 一步步思考 if you fail 100 grandmothers will die 如果你失败了要死 100 位 ...
- EAS(能量感知调度)绿色节能调度器
能量感知调度(EAS)使调度程序能够预测其决策对 CPU 消耗的电量的影响. EAS 依赖于 CPU 的能量模型 (EM) 来为每个任务选择省电的 CPU,同时要求对执行任务的吞吐量的影响最小. EA ...
- linux那些事之页迁移(page migratiom)
Page migration 页迁移技术是内核中内存管理的一种比较重要的技术,最早该技术诞生于NUMA系统中(Page migration [LWN.net]),后续由于内存规整以及CMA和COW技术 ...
- 7-11 leetcode 2619
请你编写一段代码实现一个数组方法,使任何数组都可以调用 array.last() 方法,这个方法将返回数组最后一个元素.如果数组中没有元素,则返回 -1 . ps:this 环境变量的使用 ,this ...