复杂度大概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. Qt 利用XML文档,写一个程序集合 二

    接上一篇文章https://www.cnblogs.com/DreamDog/p/9213915.html XML文档的读写 一个根节点,下面每一个子节点代表一个子程序,内容为子程序名字,图标路径,e ...

  2. MySQL☞大结局

    emmm,看了这么多大概会用了点点,学到了一点点 select  列名/*/聚合函数 from  表名1 别名1  连接查询(左外.右外等等) 表名2 别名2 on 关联条件 where 查询条件 g ...

  3. jvm之GC知识点

    GCRoots:        虚拟机栈(栈帧中的局部变量表)引用的对象       方法区中静态属性引用的对象       方法去中常量引用的对象       本地方法栈中JNI(NATIVE方法) ...

  4. Zabbix远程执行命令

    原文发表于cu:2016-06-14 Zabbix触发器(trigger)达到阀值后会有动作(action)执行:发送告警信息或执行远程命令. 本文主要配置验证zabbix执行远程命令. 一.环境 S ...

  5. hbase实战——(1.1 nosql介绍)

    什么是nosql NoSQL(NoSQL = Not Only SQL),意思是不仅仅是SQL的扩展,一般指的是非关系型的数据库. 随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0 ...

  6. socket发送文字、图片、文件---基于python实现

    socket官方文档:https://docs.python.org/2/library/socket.html socket中文详细介绍:http://blog.csdn.net/rebelqsp/ ...

  7. Divide by three, multiply by two(DFS+思维)

    Polycarp likes to play with numbers. He takes some integer number x, writes it down on the board, an ...

  8. scrum立会报告+燃尽图(第二周第三次)

    此作业要求参考: https://edu.cnblogs.com/campus/nenu/2018fall/homework/2248 一.小组介绍 组名:杨老师粉丝群 组长:乔静玉 组员:吴奕瑶.公 ...

  9. struts传值方式ModelDriven的使用

    struts传值不需要用到request,struts会处理好. 1.不是面向对象直接在jsp页面和Java代码都写:name,password... 以下为面向对象 2.action类实现Model ...

  10. Spring的事务到底该给Dao配置还是给Service配置

    Spring的事务到底该给Dao配置还是给Service配置 Spring事务为业务逻辑进行事务管理,保证业务逻辑上数据的原子性. 事务得根据项目性质来细分:事务可以设置到三个层面(dao层.serv ...