复杂度大概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次下降幂也有不错的递推性质,也可以不用转化成组合数直接类比递推,本质相同。)

最新文章

  1. 项目管理软件---redmine安装配置
  2. 项目源码--Android视频MV类网站客户端
  3. 20141128--JavaScript HTML DOM
  4. 关于DEDECMS目录移动方法
  5. BZOJ 1032 [JSOI2007]祖码Zuma
  6. sql server日期字段值的比较
  7. Matlab绘图-很详细,很全面
  8. 循环渐进linux笔记——linux系统基本机构
  9. 从零开始学习前端开发 — 7、CSS宽高自适应
  10. LeetCode - 653. Two Sum IV - Input is a BST
  11. 恶补web之八:jQuery(3)
  12. [Kubernetes]深入理解StatefulSet
  13. mass
  14. python的函数学习2
  15. jupyter notebook的路径
  16. OS位数,基本概念,结合iOS
  17. socketv 验证客户端链接的合法性
  18. C#ToString() 格式化数值
  19. html模拟组织架构横向展开
  20. 原创:MVC 5 实例教程(MvcMovieStore 新概念版:mvc5.0,EF6.01) - 1、初露锋芒

热门文章

  1. 用MYSQLworkbench导出数据excel
  2. jmeter接口测试实例:带参数、带token
  3. mui搜索框 搜索点击事件
  4. Spring学习(1):侵入式与非侵入式,轻量级与重量级
  5. 《Cocos2d-x游戏开发实战精解》学习笔记4--实战一个简单的钢琴
  6. 多用户在线FTP程序
  7. hbase Problem binding to node1/192.168.1.13:16020 : 地址已在使用
  8. 3. IP地址转换函数
  9. 软件工程-东北师大站-第六次作业PSP
  10. 团队目标WBS及具体任务分工