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 的文明世界 提供一种不需要脑子的方法. 其实是看洛谷讨论版看出来的( (但是全网也就这一篇这个方法的题解了) 首先这是一个关于树上路径的问题,我们可以无脑上点分治. 考虑当 ...
随机推荐
- CentOS7-Docker 搭建Maven私服
使用Docker搭建Maven私服 前言本文主要介绍,使用Docker创建一个nexus私服,然后编写一个Library,上传到私服,然后使用demo工程依赖. 本文不对Maven.Nexus.私服等 ...
- [转帖]nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件
nginx学习,看这一篇就够了:下载.安装.使用:正向代理.反向代理.负载均衡.常用命令和配置文件 2019-10-09 15:53:47 冯insist 阅读数 7285 文章标签: nginx学习 ...
- 三、SpringBoot整合Thymeleaf视图
目录 3.1 Thymeleaf视图介绍 3.2 创建SpringBoot项目 3.2 配置Thymeleaf 3.3 编写Demo 3.4 小结 3.1 Thymeleaf视图介绍 先看下官网的介绍 ...
- Deleaker – 内存泄漏猎人(RAD Studio 的附加组件)
程序员面临(并希望我们意识到)的常见问题之一是内存泄漏或任何其他类型的资源泄漏.例如,Windows限制了进程一次可以分配的GDI或USER32对象的数量.当事情走错路时,您可能希望拥有一些工具来帮助 ...
- 深度学习-深度强化学习(DRL)-Policy Gradient与PPO笔记
Policy Gradient 初始学习李宏毅讲的强化学习,听台湾的口音真是费了九牛二虎之力,后来看到有热心博客整理的很细致,于是转载来看,当作笔记留待复习用,原文链接在文末.看完笔记再去听一听李宏毅 ...
- 打家劫舍II
题目描述(LeetCode) 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的.同时,相邻的房屋装有相互连通的 ...
- 【题解】Luogu P5339 [TJOI2019]唱、跳、rap和篮球
原题传送门 这题zsy写的是\(O(n^2)\),还有NTT\(O(n^2\log n)\)的做法.我的是暴力,\(O(\frac{a b n}{4})\),足够通过 考虑设\(f(i)\)表示序列中 ...
- java之mybatis之配置文件讲解
1.核心配置文件 <configuration> <!-- 它们都是外部化,可替代的属性.可以配置在一个典型的Java 属性文件中,或者通过 properties 元素的子元素进行配 ...
- C#中Chart的简单使用(柱状图和折线图)
首先创建一个windows窗体应用程序,在工具箱—>数据中拖拽一个Chart控件,设置ChartArea背景色为黄色,Legend背景色为绿色,三个Series,Name属性分别为1,2,3,添 ...
- JS中的if语句内如何加or使多个条件通过
if(a==1&&b==2){ //do something }//条件是a等于1 并且 b等于2时才能成立,两个条件必须同时满足 if(a==1||b==2){ //do som ...