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 的文明世界 提供一种不需要脑子的方法. 其实是看洛谷讨论版看出来的( (但是全网也就这一篇这个方法的题解了) 首先这是一个关于树上路径的问题,我们可以无脑上点分治. 考虑当 ...
随机推荐
- VB2015运行项目时出现的错误
错误:未能加载文件或程序集“System.Net.Http.Formatting, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856a ...
- grpc Unary模式下客户端创建insecure channel的主要流程
(原创)C/C/1.25.0-dev grpc-c/8.0.0, 使用的例子是自带的例子GreeterClient grpc Unary模式下客户端创建insecure channel的主要流程 gr ...
- leetcode动态规划笔记二
动态规划 题目分类 一维dp 矩阵型DP Unique Paths II : 矩阵型DP,求所有方法总数 Minimum Path Sum:矩阵型,求最大最小值 Triangle : 矩阵型,求最大最 ...
- Luogu2481 SDOI2010 代码拍卖会 DP、组合
传送门 神仙DP 注意到\(N \leq 10^{18}\),不能够直接数位DP,于是考虑形成的\(N\)位数的性质. 因为低位一定不会比高位小,所以所有满足条件的\(N\)位数一定是不超过\(9\) ...
- 【1】【leetcode-115 动态规划】 不同的子序列
给定一个字符串 S 和一个字符串 T,计算在 S 的子序列中 T 出现的个数. 一个字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串.(例如," ...
- PTA A1016
A1016 Phone Bills (25 分) 题目内容 A long-distance telephone company charges its customers by the followi ...
- HUAWEI,H3C 三层交换机 常用命令
<HUAWEI> display ip interface brief,命令全局模式下可以查看所有端口下的ip地址及物理状态display this interface,命令用来显示当前接 ...
- Stack布局中定位的方式
//……省略无关代码…… child: new Column( children: <Widget>[ new SizedBox(height: 20.0), new Stack( ali ...
- git恢复已删的分支
git恢复已经删除的分支 执行git命令, 找回之前提交的commit git log -g 执行效果 commit 80fd3a3e1abeab52030ee9f6ec32b5c815de20a9 ...
- JS国际化网站中英文切换(理论支持所有语言)应用于h5版APP
网页框架类APP实现国际化参考文案一 参考:https://blog.csdn.net/CSDN_LQR/article/details/78026254 另外付有自己实现的方法 本人用于H5版的AP ...