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} \sum\limits_{k = 1} ^{j} dp[v][k]dp[i][j]=usonik=1jdp[v][k]

这个是毫无疑问的,然后我们考虑如何得到d≥nd \geq ndn的情况。

我们给定一个出了1号节点全是叶节点的情况,显然在根节点的统计也就是一个关于叶节点个数的多项式,当我们对根节点的情况统计求和的时候这个维度可能会升高,所以得到,在这种情况下最多就是n次多项式,

其他情况类比上面的情况,得到这是一个最多为n次的多项式,所以我们筛出前n + 1项来就能套上拉个朗日插值了,

dfsdfsdfs进行dpdpdp的复杂度是O(n2)O(n ^ 2)O(n2)的加上O(n)O(n)O(n)拉格朗日插值,整体还是O(n2)O(n ^ 2)O(n2)得。

代码

/*Author : lifehappy
*/
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>using namespace std;typedef long long ll;const int inf = 0x3f3f3f3f;
const double eps = 1e-7;const int N = 3e3 + 10, mod = 1e9 + 7;int head[N], to[N], nex[N], cnt = 1, n, d;ll dp[N][N], pre[N], suc[N], fac[N], inv[N];ll quick_pow(ll a, int n) {ll ans = 1;while(n) {if(n & 1) ans = ans * a % mod;a = a * a % mod;n >>= 1;}return ans;
}void add(int x, int y) {to[cnt] = y;nex[cnt] = head[x];head[x] = cnt++;
}void dfs(int rt, int fa) {for(int i = 1; i <= n + 1; i++) dp[rt][i] = 1;for(int i = head[rt]; i; i = nex[i]) {if(to[i] == fa) continue;dfs(to[i], rt);for(int j = 1; j <= n + 1; j++) {dp[rt][j] = (1ll * dp[rt][j] * dp[to[i]][j]) % mod;}}for(int i = 1; i <= n + 1; i++) dp[rt][i] = (dp[rt][i] + dp[rt][i - 1]) % mod;
}ll solve(int x) {if(x <= n + 1) return dp[1][x];n++;pre[0] = suc[n + 1] = fac[0] = inv[0] = 1;for(int i = 1; i <= n; i++) {pre[i] = 1ll * pre[i - 1] * (x - i) % mod;fac[i] = 1ll * fac[i - 1] * i % mod;}fac[n + 1] = 1ll * fac[n] * (n + 1) % mod;inv[n + 1] = quick_pow(fac[n + 1], mod - 2);for(int i = n; i >= 1; i--) {suc[i] = 1ll * suc[i + 1] * (x - i) % mod;inv[i] = 1ll * inv[i + 1] * (i + 1) % mod;}ll ans = 0;for(int i = 1; i <= n; i++) {ll a = 1ll * pre[i - 1] * suc[i + 1] % mod * dp[1][i] % mod;ll b = 1ll * inv[i - 1] * inv[n - i] % mod;if((n - i) & 1) b *= -1;ans = ((ans + a * b % mod) % mod + mod) % mod;}return ans;
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);scanf("%d %d", &n, &d);for(int i = 2; i <= n; i++) {int x; scanf("%d", &x);add(x, i);}dfs(1, 0);printf("%lld\n", solve(d));return 0;
}

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

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

相关文章

P4055 [JSOI2009]游戏(二分图匹配+博弈)

P4055 [JSOI2009]游戏 对于一个网格&#xff0c;上面有一些障碍物不能走&#xff0c;A选择起点&#xff0c;然后B走到相邻的四个格子之一&#xff0c;然后轮流移动不能移动的一方失败。求解所有可以赢的初始位置。 首先对于这个问题要想到网格图上博弈&#xff0c;两个人走的…

net core 3.0 之Grpc新特性小试牛刀

作者&#xff1a; 相信微服务大家伙都有听说和知道&#xff0c;好处弊端咱也不多说了&#xff0c;Grpc算是一个比较全面的微服务框架&#xff0c;也得到微软的支持总结下来就是&#xff0c;跨平台&#xff0c;可靠&#xff0c;通信快&#xff0c;扩展性强&#xff0c;网络消耗小…

Fraction Construction Problem(拓展欧几里德)

Fraction Construction Problem 思路 cd−efab\frac{c}{d} - \frac{e}{f} \frac{a}{b}dc​−fe​ba​ a<b&f<ba < b \& f < ba<b&f<b 1≤1,e≤410121 \leq 1, e \leq 4 \times10 ^{12}1≤1,e≤41012 当b 1时&#xff0c;一定无解。 gcd(a, b…

CF1168D Anagram Paths(由必要到充分/虚树)

CF1168D Anagram Paths 对于这道题首先有一个关键的性质&#xff0c;那就是对于一个树&#xff0c;它是可重排的&#xff0c;当且仅当在树上任意一个节点&#xff0c;所有字母在相关联的字符串中出现次数最大值之和小于当前点到叶子的距离。这个性质可以通过归纳证明&#xff0…

基于Coravel定时任务之计算总页数

在物联网系统中&#xff0c;需要计算底端所有设备的总数&#xff0c;除以分页每页显示数量&#xff0c;进行一个总页数的显示。包括状态&#xff0c;告警&#xff0c;日志等等数据都需要对应的总页数的显示。2.1 TaskSchedulerTaskScheduler库只支持.net&#xff0c;且需要结合…

拉格朗日插值

拉格朗日插值 简要阐述 结论给定n1n 1n1个点最多可以得到一个nnn次多项式的表达式&#xff0c;并且f(x)∑i1nyi∏j∤ix−xjxi−yjf(x) \sum_{i 1} ^{n} y_i \prod\limits_{j \nmid i}\frac{x - x_j}{x_i - y_j}f(x)∑i1n​yi​j∤i∏​xi​−yj​x−xj​​我们随便往里带入…

A Story of One Country (Hard)(中途相遇法/启发式分裂)

A Story of One Country (Hard) https://www.luogu.com.cn/problem/solution/CF1181E2 首先考虑暴力的做法&#xff0c;就是每次排序然后寻找分割点&#xff0c;对分割点左右两边分治处理&#xff0c;但是这样的复杂度是 最坏情况下O(n2logn)O(n^2logn)O(n2logn) 然后我们考…

Docker系列之AspNetCore Runtime VS .NetCore Runtime VS SDK(四)

接下来我们就要慢慢步入在.NET Core中使用Docker的殿堂了&#xff0c;如题在开始之前&#xff0c;我们需要搞清楚一些概念&#xff0c;要不然看到官方提供如下一系列镜像&#xff0c;我们会一脸懵逼&#xff0c;不知道到底要使用哪一个。AspNetCore Runtime VS .NetCore Runti…

HDU 6750 Function(莫比乌斯反演)(2020百度之星初赛1)

Function 推式子 S(n)∑i1n∑d∣id[gcd(d,id)1]∑d1nd∑d∣i[gcd(d,id)1]∑d1nd∑i1nd[gcd(d,i)1]∑d1nd∑i1nd∑k∣gcd(d,i)μ(k)∑k1nμ(k)k∑d1nkd∑i1nk2dtk2d∑t1nnt∑k2∣tμ(k)ktk2∑k1nμ(k)k∑k2∣tnttk2itk2∑k1nμ(k)k∑i1nk2nik2iS(n) \sum_{i 1} ^{n} \sum_{d …

P5170 【模板】类欧几里得算法

P5170 【模板】类欧几里得算法 https://www.cnblogs.com/bztMinamoto/p/10334354.html 对于类欧几里得算法&#xff0c;本质上可以理解为一条直线下的整点个数&#xff0c;是一个矩形区域。 然后将整数部分提出&#xff0c;就可以使得这个直线斜率较小&#xff0c;那么我们就可…

.NET Core跨平台部署于Docker(Centos)- 视频教程

.NET Core跨平台部署于Docker,Docker部署于Centos中&#xff0c;演示跨平台特性&#xff01;以下视频教程&#xff0c;请带上耳机开始聆听往期教程&#xff1a;.NET开发框架(一)-框架介绍与视频演示.NET开发框架(二)-框架功能简述.NET开发框架(三)-高可用服务器端设计.NET开发框…

矩阵快速幂各类题型总结(一般,共轭,1 * n, 矩阵简化)

Reading comprehension 这个不难找出递推式f[n]f[n−1]2f[n−2]1f[n] f[n - 1] 2f[n - 2] 1f[n]f[n−1]2f[n−2]1。 /*Author : lifehappy */ #pragma GCC optimize(2) #pragma GCC optimize(3) #include <bits/stdc.h>using namespace std;typedef long long ll;co…

【清华集训2014】Sum)(类欧几里得算法)

【清华集训2014】Sum 然后本质上我们需要求解的就是那个带根号式子的奇偶性&#xff0c;然后我们发现这个式子很像是类欧几里得算法&#xff0c;求解一个斜率为无理数直线下的整点个数&#xff0c;然后我们直接对于一般形式求解&#xff0c;那么就是每次利用整数部分将斜率减小…

一本让我多花2倍时间读的书

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「87」篇原创敬上Hi&#xff0c;大家好&#xff0c;我是Z哥。熟悉我的小伙伴应该知道&#xff0c;我平时看书大多都很快&#xff0c;之前还把自己的速读技巧分享给了…

P3355 骑士共存问题(网络流)

P3355 骑士共存问题 经典的最大独立集问题&#xff0c;最大独立集就是最小点覆盖的补集&#xff0c;因为最小点覆盖等于最大匹配&#xff0c;所以最大独立集等于点数减去最大匹配。

[NOI2005]月下柠檬树 (自适应辛普森)

P4207 [NOI2005]月下柠檬树 如图&#xff0c;我们要求的面积就是这些圆形跟梯形的组合&#xff0c;由于投射到地面上&#xff0c;显然有h′htanθh \frac{h}{tan \theta}h′tanθh​&#xff0c;由此我们就可以开始推导这个f(x)f(x)f(x)函数了。 所以转换为我们要推导出直线a…

Kong 1.3发布,原生gRPC代理、上游TLS交叉认证

Kong 1.3 发布了&#xff0c;此版本亮点包括支持原生 gRPC 代理、上游 TLS 交叉认证&#xff0c;以及一系列新功能和性能改进。原生 gRPC 代理越来越多的用户转向微服务架构&#xff0c;并且希望有对原生 gRPC 代理的支持&#xff0c;Kong 1.3 解决了这个问题&#xff0c;为支持…

自适应辛普森(算法简要 + 模板)

简述&#xff1a; 对于普通的二次函数有f(x)ax2bxcf(x) ax ^ 2 bx cf(x)ax2bxc&#xff0c;原函数F(x)ax33bx22cxF(x) \frac{a x^3}{3} \frac{bx ^2}{2} cxF(x)3ax3​2bx2​cx。 有 ⎰lrf(x)F(r)−F(l)a3(r−l)3b2(r−l)2c(r−l)(r−l)6(2a(l2r2lr)3b(lr)c)(r−l)6((al…

P3358 最长k可重区间集问题(网络流:串联思想)

P3358 最长k可重区间集问题 这是一个经典模型&#xff0c;给定n个开区间&#xff0c;选择一些区间使得每个位置被覆盖次数不超过k&#xff0c;并最大化选择的区间长度之和。 首先一个直接的想法就是每一个区间匹配了它所对应的点&#xff0c;但是我们要求选择一个区间就必须要…

对Windows桌面应用程序进行UI自动化测试

所谓UI自动化测试&#xff0c;就是模拟一个用户&#xff0c;对应用程序的UI进行操作&#xff0c;以完成特定场景的功能性集成测试。要对Windows桌面应用程序进行UI自动化测试&#xff0c;目前可选的技术主要是两种&#xff1a;VS自带的CodedUI Test和AppiumWinAppDriver。但是&…