题目链接

题意

给定一棵 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. 创建Grafana监控视图

    前言 Grafana允许查询,可视化,警报和了解指标,无论它们存储在哪里. 可视化:具有多种选项的快速灵活的客户端图.面板插件提供了许多不同的方式来可视化指标和日志. 动态仪表盘:使用模板变量创建动态 ...

  2. gcc编译链接用到的环境变量

    PATH ----  可执行程序寻找路径 C_INCLUDE_PATH  ---- 头文件寻找路径 CPLUS_INCLUDE_PATH  --- g++ 头文件路径 LD_LIBRARY_PATH  ...

  3. Java基础 之一 基本知识

    Java基础 之一 基本知识 1.数据类型 Java有8种基本数据类型 int.short .long.byte.float.double.char.boolean 先说明以下单位之间的关系 1位 = ...

  4. http请求返回ObjectJson,Array之类转换类型

    以下所说的类来自:package com.alibaba.fastjson 1,形如以下返回,其实是个json的map形式的返回 { "success": true, " ...

  5. 虚拟机、ip地址

    使用的系统 虚拟机:VMware workstations+win10:注:系统装好后先切换成Administrator,给VMware装VMware Tools linux发行版本  rhel-se ...

  6. docker下启动单机nacos

    docker run --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server 参数说明: MODE standalo ...

  7. 算法基础——Trie字符串统计

    原题链接 题目: 维护一个字符串集合,支持两种操作: "I x"向集合中插入一个字符串x: "Q x"询问一个字符串在集合中出现了多少次. 共有N个操作,输入的 ...

  8. 硕思logo设计师注册码去哪里找,文末附链接

    硕思logo设计师注册码去哪里找呢?当然是硕思logo设计师官网啦! 最近小编总是会被网友们咨询关于logo设计的问题,其中很多网友并不是专业的设计人员,特别是一些设计公司面对新手设计时,往往会不知所 ...

  9. Camtasia制作视频分割与视频拼接

    视频的分割与拼接是在制作和编辑视频中经常用到的方法,运用Camtasia视频编辑器能够让视频制作更加的简单和便捷.Camtasia是一款录频软件和视频编辑器,可以进行屏幕录制.拖放视频等操作.小编采用 ...

  10. 【性能测试】【locust】场景性能测试步骤

    场景设计 实现登陆基本功能,输出相应结果,脚本通 多用户实现随机登陆 添加初始化方法on_start: 每个用户只运行一次 添加检查点: catch_responses = True 脚本设计 # 导 ...