BZOJ2159 Crash的文明世界——树上DP&&第二类Stirling数
题意
给定一个有 $n$ 个结点的树,设 $S(i)$ 为第 $i$ 个结点的“指标值”,定义为 $S(i)=\sum_{i=1}^{n}dist(i,j)^k$,$dist(i, j)$ 为结点 $i$ 到结点 $j$ 的最小距离。请输出每个结点的指标值。($n \leq 5000, k \leq 150$)
分析
一个常用的转化
$$n^k=\sum_{i=0}^{k}S(k,i) \times C(n,i) \times i!$$
证明可以考虑组合意义,等式的左边就是把 $k$ 个球放在 $n$ 个盒子里;右边就是枚举非空盒子的数量 $i$,注意到这里的盒子是不同的,所以还要乘上一个 $i!$。
利用上面写的那个常用的转化。令 $dp[i][j]=\sum\limits_{k=1}^{n}C(dist(i,k),j)$,那么答案为 $ans_i$就可以表示成 $ans_i=\sum\limits_{j=1}^{k}S(k,j) \times j! \times dp[i][j]$。注意到 $dp[i][j]$ 是组合数是可以直接转移的,具体如下:

From: 链接
#include<cstdio>
#include<iostream>
using namespace std;
int n,k,head[];
const int mod=;
struct edg{
int to,next;
}e[];
int S[][],mi[];
int size,fd[][],fu[][];
void add(int x,int y){size++;e[size]={y,head[x]};head[x]=size;}
void dfs1(int x,int fa)
{
fd[x][]=;
for (int i=head[x];i;i=e[i].next)
{
int y=e[i].to;
if (y==fa) continue;
dfs1(y,x);
for (int j=;j<=k;j++)
{
if (j)
fd[x][j]=(fd[x][j]+fd[y][j]+fd[y][j-])%mod;
else fd[x][j]=(fd[x][j]+fd[y][j])%mod;
}
}
}
void dfs2(int x,int fa)
{
if (fa)
{
for (int i=;i<=k;i++)
{
if (i)
{
fu[x][i]=(fu[x][i]+fu[fa][i]+fu[fa][i-])%mod;
fu[x][i]=(fu[x][i]+fd[fa][i]+fd[fa][i-])%mod;
fu[x][i]=(fu[x][i]-(fd[x][i]+fd[x][i-])%mod+mod)%mod;
fu[x][i]=(fu[x][i]-fd[x][i-]+mod)%mod;
if (i>) fu[x][i]=(fu[x][i]-fd[x][i-]+mod)%mod;
}
else fu[x][]=n-fd[x][];
}
}
for (int i=head[x];i;i=e[i].next)
{
int y=e[i].to;
if (y==fa) continue;
dfs2(y,x);
}
}
int main()
{
scanf("%d%d",&n,&k);
mi[]=;for (int i=;i<=k;i++) mi[i]=mi[i-]*i%mod;
S[][]=;
for (int i=;i<=k;i++)
for (int j=;j<=i;j++)
S[i][j]=(S[i-][j-]+j*S[i-][j])%mod;
for (int x,y,i=;i<n;i++)
scanf("%d%d",&x,&y),add(x,y),add(y,x);
dfs1(,);dfs2(,);
for (int i=;i<=n;i++)
{
int ans=;
for (int j=;j<=k;j++)
ans=(ans+1ll*S[k][j]*mi[j]*(fd[i][j]+fu[i][j]))%mod;
printf("%d\n",ans);
}
}
参考链接:
1. https://blog.csdn.net/Charlie_jilei/article/details/79922722
2. https://shichengxiao01.github.io/2018/02/17/第二类斯特林数小结
BZOJ2159 Crash的文明世界——树上DP&&第二类Stirling数的更多相关文章
- BZOJ2159 Crash的文明世界(树形dp+斯特林数)
根据组合意义,有nk=ΣC(n,i)*i!*S(k,i) (i=0~k),即将k个有标号球放进n个有标号盒子的方案数=在n个盒子中选i个将k个有标号球放入并且每个盒子至少有一个球. 回到本题,可以令f ...
- BZOJ2159 Crash 的文明世界 【第二类斯特林数 + 树形dp】
题目链接 BZOJ2159 题解 显然不能直接做点分之类的,观察式子中存在式子\(n^k\) 可以考虑到 \[n^k = \sum\limits_{i = 0} \begin{Bmatrix} k \ ...
- [BZOJ2159]Crash的文明世界(斯特林数+树形DP)
题意:给定一棵树,求$S(i)=\sum_{j=1}^{n}dist(i,j)^k$.题解:根据斯特林数反演得到:$n^m=\sum_{i=0}^{n}C(n,i)\times i!\times S( ...
- BZOJ2159 Crash的文明世界
Description 传送门 给你一个n个点的树,边权为1. 对于每个点u, 求:\(\sum_{i = 1}^{n} distance(u, i)^{k}\) $ n \leq 50000, k ...
- BZOJ2159 : Crash 的文明世界
$x^k=\sum_{i=1}^k Stirling2(k,i)\times i!\times C(x,i)$ 设$f[i][j]=\sum_{k=1}^n C(dist(i,k),j)$. 则可以利 ...
- 题解 [BZOJ2159] Crash的文明世界
题面 解析 这题一眼换根DP啊 首先,我们考虑一下如何转换\(n^m\)这个式子, 先把式子摆出来吧:\(n^m=\sum_{j=0}^mS(m,j)C_n^jj!\) 其中\(S(m,j)\)表示第 ...
- 【BZOJ2159】Crash的文明世界(第二类斯特林数,动态规划)
[BZOJ2159]Crash的文明世界(第二类斯特林数,动态规划) 题面 BZOJ 洛谷 题解 看到\(k\)次方的式子就可以往二项式的展开上面考,但是显然这样子的复杂度会有一个\(O(k^2)\) ...
- 【BZOJ2159】Crash的文明世界
[2011集训贾志鹏]Crash的文明世界 Description Crash小朋友最近迷上了一款游戏--文明5(Civilization V).在这个游戏中,玩家可以建立和发展自己的国家,通过外交和 ...
- P4827「国家集训队」 Crash 的文明世界
「国家集训队」 Crash 的文明世界 提供一种不需要脑子的方法. 其实是看洛谷讨论版看出来的( (但是全网也就这一篇这个方法的题解了) 首先这是一个关于树上路径的问题,我们可以无脑上点分治. 考虑当 ...
随机推荐
- 嵌入式02 STM32 实验11 NVIC和中断总结
一.基础知识 1.cortex-m3支持256个中断,其中包含了16个内核中断,240个外部中断 2.STM32只有84个中断,包括16个内核中断和68个可屏蔽中断 3.STM32F103上只有60个 ...
- day24——面向对象三大特性、鸭子类型、类的约束、super的深度解析
day24 面向对象的三大特性 继承.封装.多态 封装:把一堆东西(代码,数据)放到一个地方(空间),并且可以使用 class Student: def __init__(self, name, se ...
- java知识精要(一)
一.java数组 (疯狂java讲义 第4.5 ~ 4.6章节) 1) 声明形式: type[] arrayName; 推荐方式 type arrayName[]; 2) 初始化: 方式一: type ...
- python3 简陋的学生信息管理系统
# 编写一个“学生信息管理系统”# 输入序号:1. 输入学生信息,学生信息包括:id,name,age,gender(用什么数据类型保存?)# 2. 查询:输入学生姓名和id,显示学生个人信息# 3. ...
- golang 之文件操作
文件操作要理解一切皆文件. Go 在 os 中提供了文件的基本操作,包括通常意义的打开.创建.读写等操作,除此以外为了追求便捷以及性能上,Go 还在 io/ioutil 以及 bufio 提供一些其他 ...
- volatile 作用
volatile使用场景:线程间共享变量需要使用 volatile 关键字标记,确保线程能够读取到更新后的最新变量值. volatile关键字的目的是告诉虚拟机: 1.每次访问变量时,总是获取主内存的 ...
- oracle学习笔记(三)
索引: drop table test1 purge; drop table test2 purge; drop table test3 purge; drop table t purge; crea ...
- JavaScript数值类型保留显示小数方法
<script type="text/javascript"> //保留两位小数 //功能:将浮点数四舍五入,取小数点后2位 function toDecimal(x) ...
- [JLOI2014]松鼠的新家 (树剖)
题目 P3258 [JLOI2014]松鼠的新家 解析 非常裸的一道树剖题 链上修改+单点查询的板子 记录一下所经过的点\(now[i]\),每次更新\(now[i-1]到now[i]\) 我们链上更 ...
- Excel 2010同时打开2个或多个独立窗口
亲测有效 参考下面的网址 https://jingyan.baidu.com/article/86fae346acca7d3c49121ad4.html 1. 在win+r 输入框里面输入“rege ...