题意

给定一个有 $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数的更多相关文章

  1. BZOJ2159 Crash的文明世界(树形dp+斯特林数)

    根据组合意义,有nk=ΣC(n,i)*i!*S(k,i) (i=0~k),即将k个有标号球放进n个有标号盒子的方案数=在n个盒子中选i个将k个有标号球放入并且每个盒子至少有一个球. 回到本题,可以令f ...

  2. BZOJ2159 Crash 的文明世界 【第二类斯特林数 + 树形dp】

    题目链接 BZOJ2159 题解 显然不能直接做点分之类的,观察式子中存在式子\(n^k\) 可以考虑到 \[n^k = \sum\limits_{i = 0} \begin{Bmatrix} k \ ...

  3. [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( ...

  4. BZOJ2159 Crash的文明世界

    Description 传送门 给你一个n个点的树,边权为1. 对于每个点u, 求:\(\sum_{i = 1}^{n} distance(u, i)^{k}\) $ n \leq 50000, k ...

  5. 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)$. 则可以利 ...

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

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

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

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

  8. 【BZOJ2159】Crash的文明世界

    [2011集训贾志鹏]Crash的文明世界 Description Crash小朋友最近迷上了一款游戏--文明5(Civilization V).在这个游戏中,玩家可以建立和发展自己的国家,通过外交和 ...

  9. P4827「国家集训队」 Crash 的文明世界

    「国家集训队」 Crash 的文明世界 提供一种不需要脑子的方法. 其实是看洛谷讨论版看出来的( (但是全网也就这一篇这个方法的题解了) 首先这是一个关于树上路径的问题,我们可以无脑上点分治. 考虑当 ...

随机推荐

  1. 后端&前端零碎知识点和注意问题

    后端 1. Spring自带的MD5加密工具类 import org.springframework.util.DigestUtils; String md5Password = DigestUtil ...

  2. Java开发笔记(一百四十三)FXML布局的基本格式

    前面介绍了JavaFX的常见控件用法,虽然JavaFX控件比起AWT与Swing要好用些,但是一样通过代码编写控件界面,并没有提高什么开发效率.要想浏览界面的展示效果,都必须运行测试程序才能观看,即使 ...

  3. Python爬虫:现学现用xpath爬取豆瓣音乐

    爬虫的抓取方式有好几种,正则表达式,Lxml(xpath)与BeautifulSoup,我在网上查了一下资料,了解到三者之间的使用难度与性能 三种爬虫方式的对比. 这样一比较我我选择了Lxml(xpa ...

  4. QT5的QChart使用记录

    如果需要在QT中使用QChart类,需要在安装的时候勾选QChart选项,在工程的 .pro 文件里面添加 QT += charts 语句,包含 QChart 头文件就行了. 对于图表的显示,可以先拖 ...

  5. android studio下 library打包文件(.aar)和本地引用

    关键点: 利用Gradle发布本地maven库支持android library 打包文件(*.aar) 的本地引用 开发环境: windows7 64位操作系统 android studio0.5. ...

  6. (七)pdf的构成之文件体(page对象)

    页面(page) 通过页面树访问文档的页面,页面树定义PDF文档中的所有页面.树包含表示PDF文档页面的节点,可以是两种类型:中间节点和叶节点.中间节点也称为页面树节点,而叶节点称为页面对象.最简单的 ...

  7. 论DOM中文档和元素的位置大小属性及其区别

    element.offsetLeft/Top  获取元素相对于最近的有定位的父元素的坐标,如果没有有定位的父元素,则是文档坐标 element.scrollTop/Left 获取元素滚动卷去的距离 e ...

  8. Java核心技术梳理-IO

    一.引言 IO(输入/输出),输入是指允许程序读取外部数据(包括来自磁盘.光盘等存储设备的数据).用户输入数据.输出是指允许程序记录运行状态,将程序数据输出到磁盘.光盘等存储设备中. IO的主要内容包 ...

  9. java之hibernate之加载策略和抓取策略

    1.加载策略:指hibernate查询数据时,采用什么样的方式将数据写入内存.Hibernate中提供了两种方式来加载数据:懒加载和即时加载. 2.懒加载又称延迟加载,指使用hiberante API ...

  10. JS前端加密JAVA后端解密详解

    最近有一个加解密的需求,其实没有什么难度,但是实践过程中踩了很多坑,把踩坑过程分享出来. 1.前端JS加密 /** * 加密(需要先加载aes.min.js文件) * @param word * @r ...