题意

给你一棵树,你要用不超过 \(D\) 的权值给每个节点赋值,保证一个点的权值不小于其子节点,问有多少种合法的方案。

\(n\leq 3000, D\leq 10^9\)

分析

  • 如果 \(D\) 比较小的话可以考虑状态 \(f_{i,j}\) 表示点 \(i\) 的权值是 \(j\) 的方案总数,\(g_{i,j}\) 表示 \(\sum_\limits{k=1}^jf_{i,j}\) ,转移也比较显然:\(f_{i,j}=\prod g_{son,j}\)

  • 先证明结论:前 \(n\) 个正整数的 \(k\) 次幂之和是 \(k+1\) 次多项式(Imagine大佬果然牛逼)

  • 可以得到,若 \(f\) 是一个 \(k\) 次多项式,且 \(g(x)=\sum_\limits{i=0}^xf(i)\) ,那么 \(g\) 是一个 \(k+1\) 次多项式。 故一个点的 \(g\) 函数的次数是它的子树大小。

  • 算出 \(D\in [0,n]\) 时的值,然后插值一波即可。

  • 因为值连续插值部分可以优化到 \(O(n)\) ,总时间复杂度为 \(O(n^2)\)。

这份代码是5个月前的有点丑陋

代码


#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<cctype>
#include<queue>
#define go(u) for(int i=head[u],v=e[i].to;i;i=e[i].last,v=e[i].to)
using namespace std;
typedef long long LL;
const LL mod=1e9 + 7;
const int N=3004;
int n,edcnt;
int head[N];
LL f[N][N],ans,D;
struct edge{
int last,to;
edge(){}edge(int last,int to):last(last),to(to){}
}e[N*2];
void Add(int a,int b){
e[++edcnt]=edge(head[a],b);head[a]=edcnt;
e[++edcnt]=edge(head[b],a);head[b]=edcnt;
}
void dfs(int u,int fa){
for(int i=1;i<=n+1;i++) f[u][i]=1ll;
go(u)if(v^fa){
dfs(v,u);
LL s=0ll;
for(int j=1;j<=n+1;j++){
(s+=f[v][j])%=mod;
f[u][j]=f[u][j]*s%mod;
}
}
}
LL Pow(LL a,LL b){
LL res=1ll;
for(;b;b>>=1,a=a*a%mod) if(b&1) res=res*a%mod;
return res;
}
int main(){
scanf("%d%I64d",&n,&D);
for(int i=2,x;i<=n;i++){
scanf("%d",&x);
Add(i,x);
}
dfs(1,0);
for(int i=2;i<=n+1;i++) (f[1][i]+=f[1][i-1])%=mod;
for(int i=1;i<=n+1;i++){
LL fz=f[1][i],fm=1ll;
for(int j=1;j<=n+1;j++)if(i^j){
fz=(fz*(D-j)%mod+mod)%mod;
fm=(fm*(i-j)%mod+mod)%mod;
}
(ans+=fz*Pow(fm,mod-2)%mod)%=mod;
}
printf("%I64d\n",ans);
return 0;
}

[CF995F]Cowmpany Cowmpensation[树形dp+拉格朗日插值]的更多相关文章

  1. codeforces 955F Cowmpany Cowmpensation 树上DP+多项式插值

    给一个树,每个点的权值为正整数,且不能超过自己的父节点,根节点的最高权值不超过D 问一共有多少种分配工资的方式? 题解: A immediate simple observation is that ...

  2. BZOJ4599[JLoi2016&LNoi2016]成绩比较(dp+拉格朗日插值)

    这个题我们首先可以dp,f[i][j]表示前i个科目恰好碾压了j个人的方案数,然后进行转移.我们先不考虑每个人的分数,先只关心和B的相对大小关系.我们设R[i]为第i科比B分数少的人数,则有f[i][ ...

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

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

  4. F. Cowmpany Cowmpensation dp+拉格朗日插值

    题意:一个数,每个节点取值是1-d,父亲比儿子节点值要大,求方案数 题解:\(dp[u][x]=\prod_{v}\sum_{i=1}^xdp[v][i]\),v是u的子节点,先预处理出前3000项, ...

  5. 【bzoj4559】[JLoi2016]成绩比较(dp+拉格朗日插值)

    bzoj 题意: 有\(n\)位同学,\(m\)门课. 一位同学在第\(i\)门课上面获得的分数上限为\(u_i\). 定义同学\(A\)碾压同学\(B\)为每一课\(A\)同学的成绩都不低于\(B\ ...

  6. 洛谷 P5469 - [NOI2019] 机器人(区间 dp+拉格朗日插值)

    洛谷题面传送门 神仙题,放在 D1T2 可能略难了一点( 首先显然对于 P 型机器人而言,将它放在 \(i\) 之后它会走到左边第一个严格 \(>a_i\) 的位置,对于 Q 型机器人而言,将它 ...

  7. BZOJ4559: [JLoi2016]成绩比较(dp 拉格朗日插值)

    题意 题目链接 Sol 想不到想不到.. 首先在不考虑每个人的真是成绩的情况下,设\(f[i][j]\)表示考虑了前\(i\)个人,有\(j\)个人被碾压的方案数 转移方程:\[f[i][j] = \ ...

  8. BZOJ2655: calc(dp 拉格朗日插值)

    题意 题目链接 Sol 首先不难想到一个dp 设\(f[i][j]\)表示选了\(i\)个严格递增的数最大的数为\(j\)的方案数 转移的时候判断一下最后一个位置是否是\(j\) \[f[i][j] ...

  9. [CF995F]Cowmpany Cowmpensation

    codeforces description 一棵\(n\)个节点的树,给每个节点标一个\([1,m]\)之间的编号,要求儿子的权值不大于父亲权值.求方案数.\(n\le3000,n\le10^9\) ...

随机推荐

  1. .gitignore文件规则不起效的解决办法

    在一个项目里面,多少会有一些文件是不需要上传到git上面的,比如node的依赖模块node_modules,这个文件夹超过10000个文件,大小也超过80M.所以,一个.gitignore文件省不了, ...

  2. Sql server bulk insert

    Bulk Insert Sql server 的bulk insert语句可以高效的导入大数据量的平面文件(txt,csv文件)到数据库的一张表中,其用法如下: bulk insert test fr ...

  3. MySQL: Connection Character Sets and Collations

    character_set_server collation_servercharacter_set_databasecollation_database character_set_clientch ...

  4. 虚拟机克隆linux centos 6.5 系统网卡配置

    作为一个刚刚接触linux系统的小白来说,VMware虚拟机安装好CentOS6.5系统后,纯净的系统多克隆几份出来方便后期做试验.克隆步骤很简单,克隆后出现的问题是克隆后的网卡MAC地址和原系统MA ...

  5. git 命令行下浏览器tig使用记录

    git 命令行下浏览器tig使用记录 tig 是一款优化 git 命令行的工具,使 git 命令行更加的便捷人性化 .如果用习惯了,会上瘾. 以下是一些使用记录: 安装成功后,在 Repo 文件夹下, ...

  6. Alpha冲刺报告(7/12)(麻瓜制造者)

    今日已完成 邓弘立: 对主页UI进行了改进 符天愉: 打算开始写留言部分并且想要实现无限回复 搜索了下网上的实现方法,总结了两种方法,一种使用递归,一种使用嵌套集合.发现嵌套集合的方法很机智,,但是感 ...

  7. [python] 列表解析式的高效与简洁

    方法一(列表解析式): list1 = ["abc","efg","hij"] list2 = [i[0] for i in list1] ...

  8. python提示警告InsecureRequestWarning

    在Python3中使用以下代码报错: import requests response = requests.get(url='', verify=False) 错误代码如下: InsecureReq ...

  9. python第二十九课——文件读写(读取数据操作)

    演示读取数据操作:path=r'a.txt' 1.打开文件f1=open(path,'r') 2.读取数据content1=f1.read(3)print(content1) content1=f1. ...

  10. gcd以及exgcd入门讲解

    gcd就是最大公约数,gcd(x, y)一般用(x, y)表示.与此相对的是lcm,最小公倍数,lcm(x, y)一般用[x, y]表示. 人人都知道:lcm(x, y) = x * y / gcd( ...