传送门

题意:

给出一颗\(n\)个结点的树,对于每个结点输出其答案,每个结点的答案为\(ans_x=\sum_{i=1}^ndis(x,i)^k\)。

思路:

我们对于每个结点将其答案展开:

\[\begin{aligned}
ans_x=&\sum_{i=0}^{n}\sum_{j=0}^k{dis(x,i)\choose j}j!\begin{Bmatrix}
k \\ j
\end{Bmatrix}\\
=&\sum_{j=0}^kj!\begin{Bmatrix}
k \\ j
\end{Bmatrix}\sum_{i=0}^n{dis(x,i)\choose j}
\end{aligned}
\]

现在就考虑如何快速求\(\displaystyle \sum_{i=0}^n{dis(x,i)\choose j}\)。

因为组合数可以展开,所以我们可以写成:

\[\sum_{i=0}^n{dis(x,i)-1\choose j-1}+{dis(x,i)-1\choose j}
\]

如果\(x\)为根节点的话,那么答案很好求,我们只需要对每个点求出其子树的答案。我们记\(f[i][j]\)为以\(i\)为根的子树中,\(\displaystyle \sum_{k=0}^n{dis(k,i)\choose j}\)的答案。那么每个结点更新答案时由其儿子结点转移过来即可。

最后再换下根即可求出以所有结点为根结点的答案,当\(u\)向\(v\)转移时,要减去\(v\)结点的贡献才能得出以\(u\)为根节点的子树的值。

细节见代码:

/*
* Author: heyuhhh
* Created Time: 2019/12/14 14:56:05
*/
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cstdio>
#include <cmath>
#include <set>
#include <map>
#include <queue>
#include <iomanip>
#define MP make_pair
#define fi first
#define se second
#define sz(x) (int)(x).size()
#define all(x) (x).begin(), (x).end()
#define INF 0x3f3f3f3f
#define Local
#ifdef Local
#define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
void err() { std::cout << '\n'; }
template<typename T, typename...Args>
void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
#else
#define dbg(...)
#endif
void pt() {std::cout << '\n'; }
template<typename T, typename...Args>
void pt(T a, Args...args) {std::cout << a << ' '; pt(args...); }
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
//head
const int N = 5e4 + 5, M = 155, MOD = 10007; int n, k;
int f[N][M], g[N][M];
vector <int> G[N];
int s[M][M], fac[M], inv[M]; ll qpow(ll a, ll b) {
ll ans = 1;
while(b) {
if(b & 1) ans = ans * a % MOD;
a = a * a % MOD;
b >>= 1;
}
return ans;
}
void init() {
s[0][0] = 1;
for(int i = 1; i < M; i++)
for(int j = 1; j <= i; j++)
s[i][j] = (s[i - 1][j] * j + s[i - 1][j - 1]) % MOD;
fac[0] = 1;
for(int i = 1; i < M; i++) fac[i] = 1ll * fac[i - 1] * i % MOD;
inv[M - 1] = qpow(fac[M - 1], MOD - 2);
for(int i = M - 2; i >= 0; i--) inv[i] = 1ll * inv[i + 1] * (i + 1) % MOD;
}
void dfs(int u, int fa) {
f[u][0] = 1;
for(int j = 0; j < sz(G[u]); j++) {
int v = G[u][j];
if(v != fa) {
dfs(v, u);
for(int i = 0; i <= k; i++) {
f[u][i] = (f[u][i] + f[v][i]) % MOD;
if(i) f[u][i] = (f[u][i] + f[v][i - 1]) % MOD;
}
}
}
}
void dfs2(int u, int fa) {
for(int j = 0; j < sz(G[u]); j++) {
int v = G[u][j];
if(v != fa) {
for(int i = 0; i <= k; i++) {
g[v][i] = (g[v][i] + g[u][i] - f[v][i] + MOD) % MOD;
if(i) g[v][i] = (g[v][i] + g[u][i - 1] - f[v][i - 1] + MOD - f[v][i - 1] + MOD) % MOD;
if(i > 1) g[v][i] = (g[v][i] - f[v][i - 2] + MOD) % MOD;
}
dfs2(v, u);
}
}
}
void run(){
//cin >> n >> k;
//for(int i = 1; i < n; i++) {
//int u, v; cin >> u >> v;
//G[u].push_back(v);
//G[v].push_back(u);
//}
int L,now,A,B,Q;
cin >> n >> k >> L >> now >> A >> B >> Q;
for(int i = 1; i < n; i++) {
now = (now * A + B) % Q;
int tmp = i < L ? i : L;
int x = i - now % tmp, y = i + 1;
G[x].push_back(y);
G[y].push_back(x);
}
dfs(1, 0);
for(int i = 1; i <= n; i++)
for(int j = 0; j <= k; j++)
g[i][j] = f[i][j];
dfs2(1, 0);
for(int i = 1; i <= n; i++) {
int ans = 0;
for(int j = 0; j <= k; j++) {
ans = (ans + 1ll * fac[j] * s[k][j] * g[i][j]) % MOD;
}
printf("%d\n", ans);
}
} int main() {
init(); run();
return 0;
}

【bzoj2159】Crash 的文明世界(树形dp+第二类斯特林数)的更多相关文章

  1. BZOJ2159 Crash的文明世界——树上DP&&第二类Stirling数

    题意 给定一个有 $n$ 个结点的树,设 $S(i)$ 为第 $i$ 个结点的“指标值”,定义为 $S(i)=\sum_{i=1}^{n}dist(i,j)^k$,$dist(i, j)$ 为结点 $ ...

  2. BZOJ 2159: Crash 的文明世界(树形dp+第二类斯特林数+组合数)

    题意 给定一棵 \(n\) 个点的树和一个常数 \(k\) , 对于每个 \(i\) , 求 \[\displaystyle S(i) = \sum _{j=1} ^ {n} \mathrm{dist ...

  3. 【hdu4045】Machine scheduling(dp+第二类斯特林数)

    传送门 题意: 从\(n\)个人中选\(r\)个出来,但每两个人的标号不能少于\(k\). 再将\(r\)个人分为不超过\(m\)个集合. 问有多少种方案. 思路: 直接\(dp\)预处理出从\(n\ ...

  4. bzoj 2159 Crash 的文明世界 && hdu 4625 JZPTREE ——第二类斯特林数+树形DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2159 学习材料:https://blog.csdn.net/litble/article/d ...

  5. P4827 [国家集训队] Crash 的文明世界(第二类斯特林数+树形dp)

    传送门 对于点\(u\),所求为\[\sum_{i=1}^ndis(i,u)^k\] 把后面那堆东西化成第二类斯特林数,有\[\sum_{i=1}^n\sum_{j=0}^kS(k,j)\times ...

  6. BZOJ 2159: Crash 的文明世界(组合数学+第二类斯特林数+树形dp)

    传送门 解题思路 比较有意思的一道数学题.首先\(n*k^2\)的做法比较好想,就是维护一个\(x^i\)这种东西,然后转移的时候用二项式定理拆开转移.然后有一个比较有意思的结论就是把求\(x^i\) ...

  7. 【BZOJ2159】Crash的文明世界(第二类斯特林数,动态规划)

    [BZOJ2159]Crash的文明世界(第二类斯特林数,动态规划) 题面 BZOJ 洛谷 题解 看到\(k\)次方的式子就可以往二项式的展开上面考,但是显然这样子的复杂度会有一个\(O(k^2)\) ...

  8. 国家集训队 Crash 的文明世界(第二类斯特林数+换根dp)

    题意 ​ 题目链接:https://www.luogu.org/problem/P4827 ​ 给定一棵 \(n\) 个节点的树和一个常数 \(k\) ,对于树上的每一个节点 \(i\) ,求出 \( ...

  9. 题解 [BZOJ2159] Crash的文明世界

    题面 解析 这题一眼换根DP啊 首先,我们考虑一下如何转换\(n^m\)这个式子, 先把式子摆出来吧:\(n^m=\sum_{j=0}^mS(m,j)C_n^jj!\) 其中\(S(m,j)\)表示第 ...

随机推荐

  1. 基于LAMP php7.1搭建owncloud云盘与ceph对象存储S3借口整合案例

    ownCloud简介 是一个来自 KDE 社区开发的免费软件,提供私人的 Web 服务.当前主要功能包括文件管理(内建文件分享).音乐.日历.联系人等等,可在PC和服务器上运行. 简单来说就是一个基于 ...

  2. Ganglia与Centreon整合构建智能化监控报警平台

    一.智能运维监控报警平台的组成 随着大数据时代的来临,运维工作的难度越来越大,每个运维人员都要面临不计其数的服务器和海量的数据,如何保证众多服务器和业务系统稳定高效地运行并尽量减少死机时间,成为考核运 ...

  3. 【大厂】389- 解密国内BAT等大厂前端技术体系-阿里篇(长文建议收藏)

    进入2019年,大前端技术生态似乎进入到了一个相对稳定的环境,React在2013年发布至今已经6年时间了,Vue 1.0在2015年发布,至今也有4年时间了. 整个业界在前端框架不断迭代中,也寻找到 ...

  4. WinForm 自定义控件 - RooF

    由3个标签组成 直接代码 public partial class Roof : UserControl { public Roof() { InitializeComponent(); } priv ...

  5. 使用vsCode配合IAR搭建arm开发环境

    众所周知IAR的编辑功能就是个垃圾,但是不得不承认IAR的编译器相当的牛X,经常以稳定可靠而著称,为此我们把VSCODE强大的编辑功能和IAR结合一下来加快我们的开发周期. 一.下载VSCODE并安装 ...

  6. 大白话简单工厂模式 (Simple Factory Pattern)

    大白话简单工厂模式 (Simple Factory Pattern) 从买车经历说起 毕业两年,码农张小两口无法忍受挤公交,凌晨起床抢火车票的痛苦,遂计划买车.逛了多家4S店,最终定下日产某车型的轿车 ...

  7. Redis基础知识、命令以及java操作Redis

    1 nosql的概念 sql:操作(关系型)数据库的标准查询语言 关系型数据库(rdbms):以关系(由行和列组成的二维表)模型为核心数据库,有表的储存系统.(mysql.oracle.sqlserv ...

  8. vue/cli新旧版本安装方式

    一.老版本安装  Shift+鼠标右键 选择打开命令窗口 1.创建项目之前,需先确保本机已经安装node 在命令窗口中执行node -v npm -v 2.一般情况下用npm安装东西比较慢,可以使用淘 ...

  9. C# ThreadPool 线程池

    Thread与ThreadPool Thread: .NetFramework1.0  对线程对象的一个封装 Thread方法很多很强大,但是太过强大,而且没有限制 功能繁多,反而用不好--就像给4岁 ...

  10. Appium 使用笔记

    零.背景 公司最近有个爬虫的项目,先拿小红书下手,但是小红书很多内容 web 端没有,只能用 app 爬,于是了解到 Appium 这个强大的框架,即可以做自动化测试,也可以用来当自动化爬虫. 本文的 ...