【题解】HDU4625 JZPTREE
题意
给定一棵 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].\)
=\sum_{v\in son(u)}\sum_{w\in T_v}[dis(v,w)+1]^{\underline{k}}
\]
这时候就可以运用上述公式。
\]
回到 \(f[u][k]\) 的定义,可得到转移方程
\]
两遍 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的更多相关文章
- HDU4625 JZPTREE 【树形DP】【第二类斯特林数】
题目大意: 对1到n求题目中描述的那个式子. 题目分析: 幂不好处理,转化为斯特林数. 根据$ n^k= \sum_ { i=0 }^k S(k,i)×i!×C(n,i) $. 我们可以将问题转化为对 ...
- HDU4625 JZPTREE——第二类斯特林数
复杂度大概O(nk) 一些尝试:1.对每个点推出1,2,3,,,到k次方的值.但是临项递推二项式展开也要考虑到具体每个点的dist 2.相邻k次方递推呢?递推还是不能避免k次方的展开 k次方比较讨厌, ...
- HDU - 4625 JZPTREE(第二类斯特林数+树DP)
https://vjudge.net/problem/HDU-4625 题意 给出一颗树,边权为1,对于每个结点u,求sigma(dist(u,v)^k). 分析 贴个官方题解 n^k并不好转移,于是 ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
随机推荐
- 谷歌Colab使用(深度学习)
1. Coalb简介 Google Colaboratory是谷歌开放的一款研究工具,主要用于机器学习的开发和研究.这款工具现在可以免费使用,但是不是永久免费暂时还不确定.Google Colab最大 ...
- python之路《九》 迭代器与生成器
1.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面 ...
- ceph的pg平衡插件balancer
前言 ceph比较老的版本使用的reweight或者osd weight来调整平衡的,本篇介绍的是ceph新的自带的插件balancer的使用,官网有比较详细的操作手册可以查询 使用方法 查询插件的开 ...
- 预估Ceph集群恢复时间
一.前言 本章很简单,就是预估集群恢复的时间,这个地方是简单的通过计算来预估需要恢复的实际,动态的显示 二.代码 #!/usr/bin/env python # -*- coding: UTF-8 - ...
- Ceph的Mon数据重新构建工具
关于mon的数据的问题,一般正常情况下都是配置的3个mon的,但是还是有人会担心 Mon 万一三个同时都挂掉了怎么办,那么集群所有的数据是不是都丢了,关于后台真实数据恢复,有去后台取对象,然后一个个拼 ...
- SpringBoot整合Xxl-Job
一.下载Xxl-Job源代码并导入本地并运行 Github地址:https://github.com/xuxueli/xxl-job 中文文档地址:https://www.xuxueli.com/xx ...
- 超级无敌详细使用ubuntu搭建hadoop完全分布式集群
一.软件准备 安装VMware 下载ubuntu镜像(阿里源ubuntu下载地址)选择自己适合的版本,以下我使用的是18.04-server版就是没有桌面的.安装桌面版如果自己电脑配置不行的话启动集群 ...
- 【剑指offer】面试题68(补充) 0到n-1中缺失的数字(二分法的进一步应用)
题目 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0到n-1之内. 在范围0到n-1的n个数字中有且只有一个数字不在该数组中,请找出这个数字. 输出 输入:[0,1,2, ...
- 为什么换了电脑安装MindManager提示密钥失效?
相信很多MindManager用户遇到过这样的问题,不想在原电脑上使用MindManager思维导图软件,想要换电脑安装,但是提示该许可证密钥失效了.下面文章就教大家如何解决这个问题: 我们在Mind ...
- FL studio系列教程(十):FL Studio中如何新建样本
FL Studio中强调以样本为核心的编曲模式.样本其实就是一个小的音序片段,可以是单独的乐器或单独的打击乐,还可以是他们组合的一个小音序片段,它是我们学习编曲的最基础知识.所以本文主要为大家讲解的是 ...