[CF995F] Cowmpany Cowmpensation(树形dp,拉格朗日插值)
树形DP:
设f[u][i]f[u][i]f[u][i]表示给uuu的子树分配工资,uuu点工资为iii的方案数
f[u][i]=∏v∈sonu(∑j=1if[v][j])f[u][i]=\prod\limits_{v\in son_u}(\sum\limits_{j=1}^{i}f[v][j])f[u][i]=v∈sonu∏(j=1∑if[v][j])
前缀和优化:
设g[u][i]=∑j=1if[u][j]g[u][i]=\sum\limits_{j=1}^{i}f[u][j]g[u][i]=j=1∑if[u][j]
f[u][i]=∏v∈sonug[v][i]f[u][i]=\prod\limits_{v\in son_u}g[v][i]f[u][i]=v∈sonu∏g[v][i]
时间复杂度O(nd)O(nd)O(nd)
考虑用拉格朗日插值优化成O(n2)O(n^2)O(n2):
设gu(x)g_u(x)gu(x)为关于xxx的函数,代入xxx,即可得到g[u][x]g[u][x]g[u][x],
合理猜想gu(x)g_u(x)gu(x)的次数为szusz_uszu(uuu的子树大小),可以用数学归纳法证明:
- 当 uuu 为叶子结点时,gu(x)=xg_u(x)=xgu(x)=x,成立。
- 当 uuu 非叶子结点时,考虑:
gu(x)−gu(x−1)=∏v∈sonugv(x)g_u(x)-g_u(x-1)=\prod\limits_{v\in son_u}g_v(x)gu(x)−gu(x−1)=v∈sonu∏gv(x)
由于 vvv 满足猜想,即gv(x)g_v(x)gv(x) 的次数为 szvsz_vszv,则 gu(x)−gu(x−1)g_u(x)-g_u(x-1)gu(x)−gu(x−1) 的次数为 ∑v∈sonuszv\sum\limits_{v\in son_u}sz_vv∈sonu∑szv,即 szu−1sz_u-1szu−1。
再还原差分,次数 +1,有 gu(x)g_u(x)gu(x) 是关于 xxx 的 szu−1+1=szusz_u-1+1=sz_uszu−1+1=szu 次函数。
所以我们只要知道g1(1),g1(2),...,g1(n)g_1(1),g_1(2),...,g_1(n)g1(1),g1(2),...,g1(n),便可以用拉格朗日插值得出g1(d)g_1(d)g1(d)
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int N=3050;
struct Edge{int v,nxt;}edge[N];
int n,cnt,head[N],fa[N];
int d,f[N][N],sum[N][N],inv[N],ans;
int add(int a,int b){return a+b>=mod?a+b-mod:a+b;}
int mul(int a,int b){return 1ll*a*b%mod;}
void addedge(int u,int v){edge[++cnt].v=v;edge[cnt].nxt=head[u];head[u]=cnt;
}
void dfs(int u){for(int i=head[u];i;i=edge[i].nxt){int v=edge[i].v;dfs(v);for(int j=1;j<=min(n,d);j++)f[u][j]=mul(f[u][j],sum[v][j]);}for(int j=1;j<=min(n,d);j++) sum[u][j]=add(sum[u][j-1],f[u][j]);
}
int main(){scanf("%d%d",&n,&d);inv[1]=1;for(int i=2;i<=n;++i) inv[i]=mul(mod-mod/i,inv[mod%i]);for(int i=2;i<=n;i++){scanf("%d",&fa[i]);addedge(fa[i],i);}for(int i=1;i<=n;i++)for(int j=1;j<=min(n,d);j++) f[i][j]=1;dfs(1);if(d<=n) printf("%d\n",sum[1][d]);else{for(int i=1;i<=n;i++){int x=sum[1][i];for(int j=0;j<=n;++j) if(i^j) x=1ll*x*(d-j+mod)%mod*(i>j?inv[i-j]:mod-inv[j-i])%mod;ans=add(ans,x);}printf("%d\n",ans);}return 0;
}
[CF995F] Cowmpany Cowmpensation(树形dp,拉格朗日插值)相关推荐
- F. Cowmpany Cowmpensation(树形dp + 拉格朗日插值)
F. Cowmpany Cowmpensation 首先一般dp推导dp[i][j]=∏u∈soni∑k=1jdp[v][k]dp[i][j] = \prod\limits_{u \in son_i} ...
- bzoj 4559 [JLoi2016]成绩比较 —— DP+拉格朗日插值
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4559 看了看拉格朗日插值:http://www.cnblogs.com/ECJTUACM-8 ...
- 解题报告(三)多项式求值与插值(拉格朗日插值)(ACM / OI)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...
- 洛谷P4463:calc(dp、拉格朗日插值)
Solution\text{Solution}Solution 神奇题目. 首先可以强制所有的数递增,最后的答案乘一个 n!n!n! 即可. 设 dpi,jdp_{i,j}dpi,j 表示在 [1, ...
- 【BZOJ4559】【JLOI2016】—成绩比较(拉格朗日插值+dp)
传送门 dpdpdp f[i][j]f[i][j]f[i][j]表示前iii门课,有jjj个人没有被碾压的方案数 考虑f[i−1][j]f[i-1][j]f[i−1][j]转移到f[i][w](j≤w ...
- 【BZOJ】2655: calc 动态规划+拉格朗日插值
[题意]一个序列$a_1,...,a_n$合法当且仅当它们都是[1,A]中的数字且互不相同,一个序列的价值定义为数字的乘积,求所有序列的价值和.n<=500,A<=10^9,n+1< ...
- P4781 【模板】拉格朗日插值
传送门 把公式实现一下即可: 当xxx连续的时候可以优化为O(N)O(N)O(N). // Problem: P4781 [模板]拉格朗日插值 // Contest: Luogu // URL: ht ...
- BNUOJ 52305 Around the World 树形dp
题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...
- [树形dp] Jzoj P5233 概率博弈
Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有 ...
最新文章
- 7-24 约分最简分式 (C语言)
- Android 4.2.2原生Launcher修改使之可以运行过程小结
- 5.Multil-task lasso(多任务lasso回归分析)
- C# Hook原理及EasyHook简易教程
- UVALive 5903 Piece it together(二分图匹配)
- 升级Jenkins镜像,支持.NET6.0
- php tp5 model 文件,tp5model的新增
- Eclipse简单字体设置
- 为什么现在微信附近人“没人”了
- mac java 更新命令行_Java 8 Update 71正在尝试安装新的帮助程序工具。 (在Mac上)...
- spring集成shiro原理
- 什么是强制性3C认证?
- 三段论_五项基本原则
- 【神经网络与深度学习】1.线性分类与感知机
- SYNS formality 形式验证常见debug 步骤
- 【论文笔记】Towards Universal Sequence Representation Learning for Recommender Systems
- 【视觉SLAM入门】一些关于视觉SLAM十四讲的重要基础概念
- 中医蜂疗新起点,新思路,新未来
- Generative Image Inpainting with Adversarial Edge Learning— 环境搭建—详细教程 ——附源码| 【ICCV 2019】
- cimoc 最新版_cimoc下载安装最新版本-cimoc软件下载-刷机助手
热门文章
- python使用opencv查找轮廓_Python+opencv学习记录20:轮廓发现,Pythonopencv
- 10-1 5-1 查询销售便携式电脑但不销售PC的厂商 (20 分)(分析+详解)
- [Nginx]nginx 配置实例-动静分离
- Java面向对象编程(基础部分)
- [Java基础]权限修饰符
- DevC++如何安装自定义头文件并使用
- ios::sync_with_stdio(false)的作用
- db2有主键时默认hash分区_MySQL分区表最佳实践
- the python challenge_The Python Challenge 谜题全解(持续更新)
- 51NOD 1220 约数之和(杜教筛)