树形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∑i​f[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∑i​f[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,拉格朗日插值)相关推荐

  1. 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} ...

  2. bzoj 4559 [JLoi2016]成绩比较 —— DP+拉格朗日插值

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4559 看了看拉格朗日插值:http://www.cnblogs.com/ECJTUACM-8 ...

  3. 解题报告(三)多项式求值与插值(拉格朗日插值)(ACM / OI)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  4. 洛谷P4463:calc(dp、拉格朗日插值)

    Solution\text{Solution}Solution 神奇题目. 首先可以强制所有的数递增,最后的答案乘一个 n!n!n! 即可. 设 dpi,jdp_{i,j}dpi,j​ 表示在 [1, ...

  5. 【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 ...

  6. 【BZOJ】2655: calc 动态规划+拉格朗日插值

    [题意]一个序列$a_1,...,a_n$合法当且仅当它们都是[1,A]中的数字且互不相同,一个序列的价值定义为数字的乘积,求所有序列的价值和.n<=500,A<=10^9,n+1< ...

  7. P4781 【模板】拉格朗日插值

    传送门 把公式实现一下即可: 当xxx连续的时候可以优化为O(N)O(N)O(N). // Problem: P4781 [模板]拉格朗日插值 // Contest: Luogu // URL: ht ...

  8. BNUOJ 52305 Around the World 树形dp

    题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...

  9. [树形dp] Jzoj P5233 概率博弈

    Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有 ...

最新文章

  1. 7-24 约分最简分式 (C语言)
  2. Android 4.2.2原生Launcher修改使之可以运行过程小结
  3. 5.Multil-task lasso(多任务lasso回归分析)
  4. C# Hook原理及EasyHook简易教程
  5. UVALive 5903 Piece it together(二分图匹配)
  6. 升级Jenkins镜像,支持.NET6.0
  7. php tp5 model 文件,tp5model的新增
  8. Eclipse简单字体设置
  9. 为什么现在微信附近人“没人”了
  10. mac java 更新命令行_Java 8 Update 71正在尝试安装新的帮助程序工具。 (在Mac上)...
  11. spring集成shiro原理
  12. 什么是强制性3C认证?
  13. 三段论_五项基本原则
  14. 【神经网络与深度学习】1.线性分类与感知机
  15. SYNS formality 形式验证常见debug 步骤
  16. 【论文笔记】Towards Universal Sequence Representation Learning for Recommender Systems
  17. 【视觉SLAM入门】一些关于视觉SLAM十四讲的重要基础概念
  18. 中医蜂疗新起点,新思路,新未来
  19. Generative Image Inpainting with Adversarial Edge Learning— 环境搭建—详细教程 ——附源码| 【ICCV 2019】
  20. cimoc 最新版_cimoc下载安装最新版本-cimoc软件下载-刷机助手

热门文章

  1. python使用opencv查找轮廓_Python+opencv学习记录20:轮廓发现,Pythonopencv
  2. 10-1 5-1 查询销售便携式电脑但不销售PC的厂商 (20 分)(分析+详解)
  3. [Nginx]nginx 配置实例-动静分离
  4. Java面向对象编程(基础部分)
  5. [Java基础]权限修饰符
  6. DevC++如何安装自定义头文件并使用
  7. ios::sync_with_stdio(false)的作用
  8. db2有主键时默认hash分区_MySQL分区表最佳实践
  9. the python challenge_The Python Challenge 谜题全解(持续更新)
  10. 51NOD 1220 约数之和(杜教筛)