【学习笔记】[AGC063E] Child to Parent

提供一个多项式做法。

分别设 f u , i , g u , i f_{u,i},g_{u,i} fu,i,gu,i表示以 u u u为根时, a u = i a_u=i au=i a u ≥ i a_u\ge i aui的方案数,合并子树 v v v时,转移如下:

f u , i = ∑ f u , i − k r × g v . k f_{u,i}=\sum f_{u,i-kr}\times g_{v.k} fu,i=fu,ikr×gv.k

初值为 f u , a u = 1 f_{u,a_u}=1 fu,au=1

注意到 DP 的值域很大,通常情况下我们可以考虑用拉格朗日插值法来处理,但是实际上只要满足信息封闭也是可以转移的。我们不妨将其转化成多项式的形式,从而来观察需要记录哪些信息。

设:
F u ( x ) = ∑ f u , i x i G u ( x ) = ∑ g u , i x i F_u(x)=\sum f_{u,i}x^i\\G_u(x)=\sum g_{u,i}x^i Fu(x)=fu,ixiGu(x)=gu,ixi

转移大致分为以下几步:

F u ( x ) ← ∏ G v ( x ) F u ( x ) ← x a i F u ( x r ) G u ( x ) ← F u ( x ) + F u ( 1 ) − F u ( x ) 1 − x F_u(x)\gets \prod G_v(x)\\F_u(x)\gets x^{a_i}F_u(x^r)\\ G_u(x)\gets F_u(x)+\frac{F_u(1)-F_u(x)}{1-x} Fu(x)Gv(x)Fu(x)xaiFu(xr)Gu(x)Fu(x)+1xFu(1)Fu(x)

其中最后一个式子是在求后缀和,之所以不能写成 1 1 − x − 1 \frac{1}{1-x^{-1}} 1x11的原因是生成函数不能有次数 < 0 <0 <0的项。

现在问题在于,要求出 F u ( 1 ) F_u(1) Fu(1)就必须维护各项系数,显然次数太高就寄了。考虑一步非常巧妙的转化:我们设 G u ′ ( x ) = G u ( x + 1 ) , F u ′ ( x ) = F u ( x + 1 ) G'_u(x)=G_u(x+1),F'_u(x)=F_u(x+1) Gu(x)=Gu(x+1),Fu(x)=Fu(x+1),则 F u ′ ( 0 ) = F u ( 1 ) F'_u(0)=F_u(1) Fu(0)=Fu(1),而 F u ′ ( 0 ) F'_u(0) Fu(0)其实就是常数项,又因为要求的答案也是常数项,这样我们只用算次数较低的项,信息就封闭了。

新的转移大致为:

F u ′ ( x ) ← ∏ G v ′ ( x ) F'_u(x)\gets \prod G'_v(x)\\ Fu(x)Gv(x)

这是因为

F u ′ ( x ) = F u ( x + 1 ) = ∏ G v ( x + 1 ) = ∏ G v ′ ( x ) F'_u(x)=F_u(x+1)=\prod G_v(x+1)=\prod G'_v(x) Fu(x)=Fu(x+1)=Gv(x+1)=Gv(x)

F u ′ ( x ) ← ( x + 1 ) a i F u ′ ( ( x + 1 ) r − 1 ) F_u'(x)\gets (x+1)^{a_i}F_u'((x+1)^r-1) Fu(x)(x+1)aiFu((x+1)r1)

这是因为

F u ′ ( x ) = F u ( x + 1 ) = ( x + 1 ) a i F u ( ( x + 1 ) r ) = ( x + 1 ) a i F u ′ ( ( x + 1 ) r − 1 ) F'_u(x)=F_u(x+1)=(x+1)^{a_i}F_u((x+1)^r)=(x+1)^{a_i}F_u'((x+1)^r-1) Fu(x)=Fu(x+1)=(x+1)aiFu((x+1)r)=(x+1)aiFu((x+1)r1)

G u ′ ( x ) = F u ′ ( x ) + F u ′ ( 0 ) − F u ′ ( x ) − x G'_u(x)=F'_u(x)+\frac{F'_u(0)-F'_u(x)}{-x} Gu(x)=Fu(x)+xFu(0)Fu(x)

如果我们只保留前 k k k项,那么因为要除以 x x x,所以每次转移完后最后一项都会损失掉。但是因为答案是第一项的值,所以我们对于每个节点保留 d e p u dep_u depu项即可。

复杂度 O ( n 3 ) O(n^3) O(n3)

麻了,好像和官方题解长得一样。

#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;
const int mod=998244353;
int n,fa[305],dep[305];
ll r,fac[305],inv[305],ifac[305],to[305][305],f[305][305],g[305][305],a[305],res;
vector<int>G[305];
ll fpow(ll x,ll y=mod-2){ll z(1);for(;y;y>>=1){if(y&1)z=z*x%mod;x=x*x%mod;}return z;
}
ll binom(int x,int y){if(x<0||y<0||x<y)return 0;return fac[x]*inv[y]%mod*inv[x-y]%mod;
}
void init(int n){fac[0]=1;for(int i=1;i<=n;i++)fac[i]=fac[i-1]*i%mod;inv[n]=fpow(fac[n]);for(int i=n;i>=1;i--)inv[i-1]=inv[i]*i%mod;ifac[1]=1;for(int i=2;i<=n;i++)ifac[i]=mod-ifac[mod%i]*(mod/i)%mod;
}
void dfs(int u){f[u][0]=1;for(auto v:G[u]){dep[v]=dep[u]+1,dfs(v);memset(f[0],0,sizeof f[0]);for(int i=0;i<=dep[v];i++)for(int j=0;i+j<=dep[v];j++)(f[0][i+j]+=f[u][i]*g[v][j])%=mod;memcpy(f[u],f[0],sizeof f[0]);}memset(f[0],0,sizeof f[0]);for(int i=0;i<=dep[u]+1;i++)for(int j=0;j<=dep[u]+1;j++)(f[0][j]+=f[u][i]*to[i][j])%=mod;memset(f[u],0,sizeof f[u]);ll mul=1;for(int i=0;i<=dep[u]+1;i++){for(int j=0;i+j<=dep[u]+1;j++)(f[u][i+j]+=mul*f[0][j])%=mod;mul=mul*(a[u]-i)%mod*ifac[i+1]%mod;}for(int i=0;i<=dep[u];i++)g[u][i]=(f[u][i]+f[u][i+1])%mod;
}
signed main(){//freopen("data.in","r",stdin);ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n;for(int i=2;i<=n;i++)cin>>fa[i],G[fa[i]].pb(i);cin>>r;init(n);to[0][0]=1;for(int i=1;i<=n;i++){for(int j=0;j<=i;j++){ll mul=1;int sgn=(i-j&1)?-1:1;for(int k=0;k<=n;k++){(to[i][k]+=sgn*binom(i,j)*mul)%=mod;mul=mul*((j*r-k)%mod)%mod*ifac[k+1]%mod;}}}for(int i=1;i<=n;i++)cin>>a[i];dfs(1);cout<<(f[1][0]+mod)%mod;
}

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

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

相关文章

达梦报错:无效IP,设置达梦访问IP白名单

管理工具连接远程库&#xff0c;报错&#xff1a;无效IP 1.:关闭防火墙 systemctl status firewalld service iptables status 2.查看用户和用户状态 select username,ACCOUNT_STATUS from dba_users;3.查看用户 访问ip限制和资源限制 select id,failed_num,allow_addr fro…

倒排索引介绍

1.简介 倒排索引&#xff08;Inverted Index&#xff09;是信息检索系统中最常用的数据结构之一&#xff0c;它用来存储在全文搜索下某个单词存在于哪些文档或数据记录中。与传统的正排索引&#xff08;文档到关键词的映射&#xff09;不同&#xff0c;倒排索引建立了从关键词…

目标检测开源数据集——道路坑洼

一、危害 对车辆的影响&#xff1a;道路坑洼会导致车辆行驶不稳&#xff0c;增加车辆的颠簸&#xff0c;不仅影响乘坐舒适度&#xff0c;还可能对车辆的悬挂系统、轮胎等造成损害。长期在坑洼路面上行驶&#xff0c;车辆的减震系统、悬挂系统等关键部件容易受损&#xff0c;进…

Redis和MySQL如何保持数据一致性

前言 在高并发的场景下&#xff0c;大量的请求直接访问Mysql很容易造成性能问题。所以&#xff0c;我们都会用Redis来做数据的缓存&#xff0c;削减对数据库的请求。但是&#xff0c;Mysql和Redis是两种不同的数据库&#xff0c;如何保证不同数据库之间数据的一致性就非常关键…

【封装一个日志库(linux)】【转载】

原文链接&#xff1a; 工具库1&#xff1a;封装一个日志库&#xff08;linux)-CSDN博客 一、&#xff0c;需求 &#xff08;1&#xff09;封装一个c/c日志库&#xff0c;提供格式打印接口&#xff0c;编写程序代码时方便使用&#xff1b; &#xff08;2&#xff09; 格式打印…

Mybatis----面向接口

让mybatis自动生成dao层接口的实现类 这是dao层接口的实现类&#xff0c;在mybatis中我们可以省略这种实现接口的方式&#xff0c;直接面向接口操作数据库&#xff0c;mybatis可以帮我们自动生成接口的实现类&#xff0c;也就是下面这个实现类mybatis帮我们生成了。 1、修改se…

检测射线与边界盒AABB相交(C#代码Unity环境下测试通过)

说明&#xff1a;如果仅仅是再Unity环境下使用的话&#xff0c;直接使用Bounds.IntersectRay方法就好了&#xff0c;这里仅仅探索其算法。 上代码&#xff1a; bool RayCrossBounds(Ray ray, Bounds bounds) {if (bounds.Contains(ray.origin)) return true;//float tMinX fl…

P3952 [NOIP2017 提高组] 时间复杂度————C++

目录 [NOIP2017 提高组] 时间复杂度题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 解题思路Code运行结果 [NOIP2017 提高组] 时间复杂度 题目背景 NOIP2017 提高组 D1T2 题目描述 小明正在学习一种新的编程语言 A&#xff0c;刚学会循环语句的他激动…

openssl3.2 - 官方demo学习 - guide - tls-client-block.c

文章目录 openssl3.2 - 官方demo学习 - guide - tls-client-block.c概述记录问题server和client IP都为localhostserver和client IP都为127.0.0.1想到解决问题的方法1想到解决问题的方法2笔记END openssl3.2 - 官方demo学习 - guide - tls-client-block.c 概述 tls 客户端 官…

QT5构建套件检测不到MSVC2017解决方法

文章目录 前言一、本地环境二、现象三、解决办法 前言 记录一下 QT5 构建套件检测不到 MSVC2017 解决方法 。Qt Creator MSVC开发环境搭建&#xff08;Qt Creator 集成工具 MSVC编译&#xff09; 一、本地环境 电脑操作系统&#xff1a;Win11Qt 版本&#xff1a;Qt 5.14.2 …

linux基础学习(2):磁盘管理、分区、格式化

1.一些基本概念 一块磁盘从加入到可使用&#xff0c;需要经过3个阶段&#xff1a;分区-格式化-挂载。 1.1分区方式 linux有2种分区方式&#xff1a; &#xff08;1&#xff09;mbr&#xff1a;最大支持2.1T硬盘&#xff0c;最多支持4个分区。这4个分区可以全部为主分区&…

77、avx2 向量寄存器介绍

本节带大家简单了解下计算机内的存储器,了解了存储器之后,对于后面的优化就会有更深刻的认识。 我们最熟悉的存储器就是电脑的内存,或者硬盘。在计算机系统中,我们可以把所有可以存储数据的部件都叫做存储器。 只不过很多是用户可见并熟悉的,如硬盘和内存条,GPU 的显存…

【elementUI】el-select相关问题

官方使用DEMO <template><el-select v-model"value" placeholder"请选择"><el-optionv-for"item in options":key"item.value":label"item.label":value"item.value"></el-option></…

鸿蒙开发笔记(三):页面和自定义组件生命周期

先明确自定义组件和页面的关系&#xff1a; 自定义组件&#xff1a;Component装饰的UI单元&#xff0c;可以组合多个系统组件实现UI的复用。 页面&#xff1a;即应用的UI页面。可以由一个或者多个自定义组件组成&#xff0c;Entry装饰的自定义组件为页面的入口组件&#xff0c…

QEMU与KVM基本概述

一些术语 汇总在虚拟化世界里经常会涉及到的术语或缩写等。 术语含义VMVirtual Machine&#xff0c;虚拟机VMM在系统虚拟化中&#xff0c;管理全局物理资源的软件叫作虚拟机监控器&#xff08;Virtual MachineMonitor&#xff0c;VMM&#xff09;&#xff0c;VMM之于虚拟机就…

一篇文章掌握WebService服务、工作原理、核心组件、主流框架

目录 1、WebService定义 解决问题&#xff1a; 2、WebService的工作原理 2.1 实现一个完整的Web服务包括以下步骤 2.2 调用方式 3、Web Service的核心组件 3.1 XML 3.2 SOAP 3.3 WSDL 3.4 UDDI 4、主流框架 4.1 AXIS(已淘汰) 4.2 XFire 4.3 CXF 5、Soap协议详解…

从DETR到Mask2former(2): 损失函数loss function

DETR的损失函数包括几个部分&#xff0c;如果只看论文或者代码&#xff0c;比较难理解&#xff0c;最好是可以打断点调试&#xff0c;对照着论文看。但是现在DETR模型都已经被集成进各种框架中&#xff0c;很难进入内部打断掉调试。与此同时&#xff0c;数据的label的前处理也比…

《动手学深度学习》学习笔记 第8章 循环神经网络

本系列为《动手学深度学习》学习笔记 书籍链接&#xff1a;动手学深度学习 笔记是从第四章开始&#xff0c;前面三章为基础知识&#xff0c;有需要的可以自己去看看 关于本系列笔记&#xff1a; 书里为了让读者更好的理解&#xff0c;有大篇幅的描述性的文字&#xff0c;内容很…

Vue3中动态组件使用

一&#xff0c;动态组件使用&#xff1a; 应用场景&#xff1a;动态绑定或切换组件 应用Vue3碎片&#xff1a; is 1.使用 a.组件A <div class"layout-base"><Button>红茶</Button> </div>a.组件B <div class"layout-base"&g…

python基础教程九 抽象一(函数初步)

1. 懒惰是种美德 前面编写的程序都很小&#xff0c;但如果要编写大型程序&#xff0c;你很快会遇到麻烦。想想看&#xff0c;如果你在一个地方编写了一些代码&#xff0c;但需要在另一个地方再次使用&#xff0c;该如何办?例如&#xff0c;假设你编写了一段代码&#xff0c;他…