题目链接

题意

给定一棵 n 点的树,定义 \(dis(u,v)\) 为树上路径长度。对于每个点,定义 \(E_u=\sum_{v=1}^n dis(u,v)^k\) ,其中 k 为给定数。

求每个 \(E_i\mod 10007 (i=1\sim n)\) .

思路

求幂可以考虑转化成第二类斯特林数。有公式: \(x^n = \sum_{k=0}^n \begin{Bmatrix} n \\ k \end{Bmatrix} x^{\underline{k}}.\)

从而 \(E_u = \sum_{v=1}^n (dis(u, v))^k = \sum_{i=0}^k \begin{Bmatrix} k \\ i \end{Bmatrix} \sum_{v=1}^n (dis(u, v))^{\underline{i}}.\)

令 \(f[u][k] = \sum_{v \in T_u} (dis(u, v))^{\underline{k}},\) \(T_u\) 为 \(u\) 为根的子树,且显然有 \((x+1)^{\underline{k}} = x^{\underline{k}}+kx^{\underline{k-1}}\)

考虑求 \(f[u][k].\)

\[f[u][k]=\sum_{v\in T_u} dis(u,v)^{\underline{k}}
=\sum_{v\in son(u)}\sum_{w\in T_v}[dis(v,w)+1]^{\underline{k}}
\]

这时候就可以运用上述公式。

\[f[u][k]=\sum_{v\in son(u)}\sum_{w\in T_v} [dis(v,w)^{\underline{k}}+k\times dis(v,w)^{\underline{k-1}}]
\]

回到 \(f[u][k]\) 的定义,可得到转移方程

\[f[u][k]=\sum_{v\in son(u)} f[v][k]+k\times f[v][k-1]
\]

两遍 DFS 即可。

代码

#include <bits/stdc++.h>
using namespace std;
const int N=5e4+10,K=510,mod=10007;
int n,k,S[N][K],f[N][K],g[N][K];
vector<int> v[N]; void dfs1( int x,int fa )
{
f[x][0]=1;
for ( int i=1; i<=k; i++ ) f[x][i]=0;
for ( auto y : v[x] )
{
if ( y==fa ) continue;
dfs1( y,x );
f[x][0]=(f[x][0]+f[y][0])%mod;
for ( int i=1; i<=k; i++ )
f[x][i]=( f[x][i]+(f[y][i]+i*f[y][i-1]))%mod;
}
} void dfs2( int x,int fa )
{
if ( !fa ) for ( int i=0; i<=k; i++ ) g[x][i]=f[x][i];
for ( auto y : v[x] )
{
if ( y==fa ) continue;
g[y][0]=g[x][0];
for ( int i=1; i<=k; i++ )
{
int t1=(g[x][i]-(f[y][i]+i*f[y][i-1]))%mod;
int t2=( g[x][i-1]-( f[y][i-1]+(i-1)*(i-2>=0 ? f[y][i-2] : 0) ))%mod;
g[y][i]=( f[y][i]+( t1+i*t2) )%mod;
}
dfs2( y,x );
}
} void init()
{
S[0][0]=1;
for ( int i=1; i<=500; i++ )
for ( int j=1; j<=i; j++ )
S[i][j]=(S[i-1][j-1]+S[i-1][j]*j)%mod;
} int main()
{
int T; scanf( "%d",&T ); init();
while ( T-- )
{
scanf( "%d%d",&n,&k );
for ( int i=1; i<=n; i++ )
v[i].clear();
for ( int i=1,x,y; i<n; i++ )
scanf( "%d%d",&x,&y ),v[x].push_back(y),v[y].push_back(x); dfs1( 1,0 ); dfs2( 1,0 ); for ( int x=1;x<=n; x++ )
{
int res=0;
for ( int i=0; i<=k; i++ )
res=( res+S[k][i]*g[x][i])%mod;
printf( "%d\n",(res+mod)%mod );
}
}
}

【题解】HDU4625 JZPTREE的更多相关文章

  1. HDU4625 JZPTREE 【树形DP】【第二类斯特林数】

    题目大意: 对1到n求题目中描述的那个式子. 题目分析: 幂不好处理,转化为斯特林数. 根据$ n^k= \sum_ { i=0 }^k S(k,i)×i!×C(n,i) $. 我们可以将问题转化为对 ...

  2. HDU4625 JZPTREE——第二类斯特林数

    复杂度大概O(nk) 一些尝试:1.对每个点推出1,2,3,,,到k次方的值.但是临项递推二项式展开也要考虑到具体每个点的dist 2.相邻k次方递推呢?递推还是不能避免k次方的展开 k次方比较讨厌, ...

  3. HDU - 4625 JZPTREE(第二类斯特林数+树DP)

    https://vjudge.net/problem/HDU-4625 题意 给出一颗树,边权为1,对于每个结点u,求sigma(dist(u,v)^k). 分析 贴个官方题解 n^k并不好转移,于是 ...

  4. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  5. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  6. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  7. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  8. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  9. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

随机推荐

  1. 主动关闭 time-wait 2msl 处理

    先上传后面整理 /* * This routine is called by the ICMP module when it gets some * sort of error condition. ...

  2. 【webSokect】基于django Channels的简单实现

    # settings.py: INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.con ...

  3. Java 架构学习图谱

  4. WPF窗体中嵌入/使用WinForm类/控件(基于.NET Core)

    如题,WPF中嵌入WinForm的做法,网络上已经很多示例,都是基于.NET XXX版的. 今天King様在尝试WPF(基于.NET Core 3.1)中加入Windows.Forms.ColorDi ...

  5. 测试cephfs写入海量文件

    前言 测试cephfs的写入大量文件,通过mdtest写入1K大小的文件1亿个,每个目录里面文件为1万,目录总数为1万,总文件数目就为1亿了 写入的命令 mdtest -C -F -L -z 4 -b ...

  6. mon磁盘满重启的问题

    问题 Ceph monitors 100% full filesystem, refusing start 问题原文 I have an issue with a (not in production ...

  7. Python_入门第一篇【持续更新...】

    1.准备 准备电脑 和 分区 1.准备配置稍高的电脑(后后期需要装虚拟机),分辨率1920*1080 2.分区: C→系统 D→Project E→软件安装盘 F→其他 准备编辑器 1.Sublime ...

  8. Python_教程_使用Visual Studio Code开发Django项目

    如何获得 Visual Studio Code 访问 http://code.visualstudio.com 下载并安装. 前提条件 安装Python 2.7 及 Python 3.5,Window ...

  9. MySQL存储索引InnoDB数据结构为什么使用B+树,而不是其他树呢?

    InnoDB的一棵B+树可以存放多少行数据? 答案:约2千万 为什么是这么多? 因为这是可以算出来的,要搞清楚这个问题,先从InnoDB索引数据结构.数据组织方式说起. 计算机在存储数据的时候,有最小 ...

  10. 如何修改IDM下载器的临时文件夹位置

    所有的应用程序在下载时,都会有一些默认的选项.比如产生的临时文件存放在C盘目录下,或者定期自动更新等设置.那么当我们的计算机上安装了很多程序之后,C盘的空间就会渐渐地变小了,从而有了空间不足等等情况, ...