复杂度大概O(nk)

一些尝试:
1.对每个点推出1,2,3,,,到k次方的值。但是临项递推二项式展开也要考虑到具体每个点的dist

2.相邻k次方递推呢?递推还是不能避免k次方的展开

k次方比较讨厌,于是考虑用斯特林数处理

转化成求k个后面这个C(dis,i)

组合数相比较于k次方有什么好处呢?
有直接的简单的递推式!

并且恰好的是,可以直接树形dp,距离对于子树恰好-1

O(nk)树形dp一遍

然后换根O(nk)再处理一遍

回到主函数,把之前的那些东西在分别乘上加起来即可。

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=+;
const int K=;
const int mod=;
int n,k,t;
struct node{
int nxt,to;
}e[*N];
int hd[N],cnt;
int f[N][K];
int g[N][K];
int jie[K],s[K][K];
void add(int x,int y){
e[++cnt].nxt=hd[x];
e[cnt].to=y;
hd[x]=cnt;
}
void dfs(int x,int fa){
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(y==fa) continue;
dfs(y,x);
for(reg j=;j<=k;++j){
if(j)f[x][j]=(f[x][j]+f[y][j]+f[y][j-])%mod;
else f[x][j]=(f[x][j]+f[y][j])%mod;
}
}
f[x][]=(f[x][]+)%mod;
}
void sol(int x,int fa){
if(x==){
for(reg j=;j<=k;++j) g[x][j]=f[x][j];
}
else{
for(reg j=;j<=k;++j){
if(j>) g[x][j]=(f[x][j]+(g[fa][j]-(f[x][j]+f[x][j-])+mod)%mod+(g[fa][j-]-(f[x][j-]+f[x][j-]))%mod+mod+mod)%mod;
else if(j==) g[x][j]=(f[x][j]+(g[fa][j]-(f[x][j]+f[x][j-])+mod)%mod+(g[fa][j-]-(f[x][j-]))%mod+mod+mod)%mod;
else g[x][j]=n;
}
}
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(y==fa) continue;
sol(y,x);
}
}
void clear(){
cnt=;
memset(hd,,sizeof hd);
memset(f,,sizeof f);
memset(g,,sizeof g);
}
int main(){
rd(t);
s[][]=;
for(reg i=;i<=;++i){
for(reg j=;j<=;++j){
s[i][j]=(s[i-][j-]+j*(s[i-][j])%mod)%mod;
}
}
jie[]=;
for(reg i=;i<=;++i) jie[i]=jie[i-]*i%mod;
while(t--){
clear();
rd(n);rd(k);
int x,y;
for(reg i=;i<n;++i){
rd(x);rd(y);
add(x,y);add(y,x);
}
dfs(,);
// for(reg i=1;i<=n;++i){
// cout<<" ii "<<i<<endl;
// for(reg j=0;j<=k;++j){
// cout<<" f[i]["<<j<<"]"<<" : "<<f[i][j]<<endl;
// }cout<<endl;
// }cout<<endl;
sol(,);
// for(reg i=1;i<=n;++i){
// cout<<" ii "<<i<<endl;
// for(reg j=0;j<=k;++j){
// cout<<" g[i]["<<j<<"]"<<" : "<<g[i][j]<<endl;
// }cout<<endl;
// }cout<<endl; for(reg i=;i<=n;++i){
int ans=;
for(reg j=;j<=k;++j){
ans=(ans+jie[j]*s[k][j]%mod*g[i][j]%mod)%mod;
}
printf("%d\n",ans);
}
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2018/12/29 19:09:56
*/

总结:
这个就真的比较有趣了

把n^k换成斯特林数,还有一个原因是n^k实在不好支持递推

组合数就比较轻松了。

恰好树形dp的递推特点和组合数的递推式又比较好的吻合在一起!

(当然,n的i次下降幂也有不错的递推性质,也可以不用转化成组合数直接类比递推,本质相同。)

HDU4625 JZPTREE——第二类斯特林数的更多相关文章

  1. bzoj 2159 Crash 的文明世界 && hdu 4625 JZPTREE ——第二类斯特林数+树形DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2159 学习材料:https://blog.csdn.net/litble/article/d ...

  2. bzoj 2159 Crash 的文明世界 & hdu 4625 JZPTREE —— 第二类斯特林数+树形DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2159 使用公式:\( n^{k} = \sum\limits_{i=0}^{k} S(k,i ...

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

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

  4. 【BZOJ5093】图的价值(第二类斯特林数,组合数学,NTT)

    [BZOJ5093]图的价值(第二类斯特林数,组合数学,NTT) 题面 BZOJ 题解 单独考虑每一个点的贡献: 因为不知道它连了几条边,所以枚举一下 \[\sum_{i=0}^{n-1}C_{n-1 ...

  5. 【BZOJ4555】求和(第二类斯特林数,组合数学,NTT)

    [BZOJ4555]求和(第二类斯特林数,组合数学,NTT) 题面 BZOJ 题解 推推柿子 \[\sum_{i=0}^n\sum_{j=0}^iS(i,j)·j!·2^j\] \[=\sum_{i= ...

  6. CF932E Team Work(第二类斯特林数)

    传送门:CF原网 洛谷 题意:给定 $n,k$,求 $\sum\limits^n_{i=1}\dbinom{n}{i}i^k\bmod(10^9+7)$. $1\le n\le 10^9,1\le k ...

  7. 【CF961G】Partitions 第二类斯特林数

    [CF961G]Partitions 题意:给出n个物品,每个物品有一个权值$w_i$,定义一个集合$S$的权值为$W(S)=|S|\sum\limits_{x\in S} w_x$,定义一个划分的权 ...

  8. 【CF932E】Team Work(第二类斯特林数)

    [CF932E]Team Work(第二类斯特林数) 题面 洛谷 CF 求\(\sum_{i=1}^nC_{n}^i*i^k\) 题解 寒假的时候被带飞,这题被带着写了一遍.事实上并不难,我们来颓柿子 ...

  9. 【51NOD 1847】奇怪的数学题(莫比乌斯反演,杜教筛,min_25筛,第二类斯特林数)

    [51NOD 1847]奇怪的数学题(莫比乌斯反演,杜教筛,min_25筛,第二类斯特林数) 题面 51NOD \[\sum_{i=1}^n\sum_{j=1}^nsgcd(i,j)^k\] 其中\( ...

随机推荐

  1. 【洛谷】题解 P1056 【排座椅】

    题目链接 因为题目说输入保证会交头接耳的同学前后相邻或者左右相邻,所以一对同学要分开有且只有一条唯一的通道才能把他们分开. 于是可以吧这条通道累加到一个数组里面.应为题目要求纵列的通道和横列的通道条数 ...

  2. 高可用Kubernetes集群-6. 部署kube-apiserver

    八.部署kube-apiserver 接下来3章节是部署Kube-Master相关的服务,包含:kube-apiserver,kube-controller-manager,kube-schedule ...

  3. docker应用容器化准则—12 factor

    在云的时代,越来越多的传统应用需要迁移到云环境下,新应用也要求能适应云的架构设计和开发模式.而12-factor提供了一套标准的云原生应用开发的最佳原则. 在容器云项目中应用容器化主要参考12-Fac ...

  4. Linux系统进程管理

    Linux系统进程管理 什么是进程 进程是已启动的可执行程序的运行实例,进程有以下组成部分: 分配内存, 已分配内存的地址空间 安全属性, 进程的运行身份和权限 进程代码, 运行一个或多个的线程 进程 ...

  5. Python基础灬序列(字符串、列表、元组)

    序列 序列是指它的成员都是有序排列,并且可以通过下标偏移量访问到它的一个或几个成员.序列包含字符串.列表.元组. 字符串 chinese_zodiac = '鼠牛虎兔龙蛇马羊猴鸡狗猪' print(c ...

  6. SSH新学,关于面向对象的看法

    流程:model-->dao-->service-->impService-->action 如果只是操作单个的一个表,比如user表,则都写到user的流程中 如果要操作俩个 ...

  7. 团队作业4——第一次项目冲刺(Alpha版本)第一次

    一.会议内容 制定任务内容 制作leangoo表格 初步工作 二.各人工作 成员 计划任务 遇见难题 贡献比 塗家瑜(组长) 后端与数据库通讯 无 1 张新磊 表设计 无 1 姚燕彬 测试计划编写 无 ...

  8. WebService(三)

    JAX-WS简单使用示例: 1.服务端 package com.rong.service; import javax.jws.WebMethod; import javax.jws.WebParam; ...

  9. Java数学函数Math类

    Java数学函数Math类常用: Math.abs(12.3); //12.3 返回这个数的绝对值 Math.abs(-12.3); //12.3 Math.copySign(1.23, -12.3) ...

  10. mysql中用户和权限

    用户管理 用户数据所在位置: mysql中的所有用户,都存储在系统数据库(mysql)中的user 表中——不管哪个数据库的用户,都存储在这里. 表初始内容如下: 创建用户: 形式: create   ...