正题

题目链接:https://www.luogu.com.cn/problem/P4827


题目大意

一颗nnn个点的树,定义dis(i,j)dis(i,j)dis(i,j)表示树上i,ji,ji,j两点的距离,对于每个iii求∑j=1ndis(i,j)m\sum_{j=1}^ndis(i,j)^mj=1∑n​dis(i,j)m


解题思路

根据斯特林数的性质我们有
nm=∑k=0m{mk}(nk)k!n^m=\sum_{k=0}^m\begin{Bmatrix}m\\k\end{Bmatrix}\binom{n}{k}k!nm=k=0∑m​{mk​}(kn​)k!
那么就有
dis(i,j)m=∑k=0m{mk}(dis(i,j)k)k!dis(i,j)^m=\sum_{k=0}^m\begin{Bmatrix}m\\k\end{Bmatrix}\binom{dis(i,j)}{k}k!dis(i,j)m=k=0∑m​{mk​}(kdis(i,j)​)k!
也就是要求
∑j=1ndis(i,j)m=∑j=1n(∑k=0m{mk}(dis(i,j)k)k!)\sum_{j=1}^ndis(i,j)^m=\sum_{j=1}^n(\sum_{k=0}^m\begin{Bmatrix}m\\k\end{Bmatrix}\binom{dis(i,j)}{k}k!)j=1∑n​dis(i,j)m=j=1∑n​(k=0∑m​{mk​}(kdis(i,j)​)k!)
⇒∑j=1ndis(i,j)m=∑k=0m{mk}k!∑j=1n(dis(i,j)k)\Rightarrow\sum_{j=1}^ndis(i,j)^m=\sum_{k=0}^m\begin{Bmatrix}m\\k\end{Bmatrix}k!\sum_{j=1}^n\binom{dis(i,j)}{k}⇒j=1∑n​dis(i,j)m=k=0∑m​{mk​}k!j=1∑n​(kdis(i,j)​)

考虑树形dpdpdp计算后面的贡献,设fx,jf_{x,j}fx,j​表示以111为根,在xxx的子树中在(dis1,yj)\binom{dis_{1,y}}{j}(jdis1,y​​)的值和。可以根据(nm)=(n−1m−1)+(n−1m)\binom{n}{m}=\binom{n-1}{m-1}+\binom{n-1}{m}(mn​)=(m−1n−1​)+(mn−1​)可以O(nk)O(nk)O(nk)求出

然后根据转移方程换根求其他点为根的答案。

时间复杂度O(nk)O(nk)O(nk)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=5e4+10,K=170,XJQ=10007;
struct node{int to,next;
}a[N*2];
int n,m,tot,S[N][K],fac[K];
int f[N][K],g[N][K],ls[N];
void init(){S[0][0]=S[1][1]=fac[0]=1;for(int i=1;i<=m;i++)fac[i]=fac[i-1]*i%XJQ;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)(S[i][j]=S[i-1][j-1]+j*S[i-1][j]%XJQ)%=XJQ;return;
}
void addl(int x,int y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return;
}
void dfs(int x,int fa){f[x][0]=1;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa)continue;dfs(y,x);for(int j=1;j<=m;j++)(f[x][j]+=f[y][j]+f[y][j-1])%=XJQ;(f[x][0]+=f[y][0])%=XJQ;}return;
}
int k(int x,int j,int fa)
{return (g[fa][j]-f[x][j]-(j?f[x][j-1]:0)+2*XJQ)%XJQ;}
void dp(int x,int fa){for(int j=1;j<=m;j++)g[x][j]=(k(x,j,fa)+k(x,j-1,fa))%XJQ;g[x][0]=k(x,0,fa)+1;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa)continue;for(int j=1;j<=m;j++)(g[x][j]+=f[y][j]+f[y][j-1])%=XJQ;(g[x][0]+=f[y][0])%=XJQ;}for(int i=ls[x];i;i=a[i].next)if(a[i].to!=fa)dp(a[i].to,x);return;
}
int main()
{scanf("%d%d",&n,&m);init();for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);addl(x,y);addl(y,x);}dfs(1,1);for(int i=0;i<=m;i++)g[1][i]=f[1][i];for(int i=ls[1];i;i=a[i].next)dp(a[i].to,1);for(int i=1;i<=n;i++){int ans=0;for(int j=0;j<=m;j++)(ans+=S[m][j]*fac[j]%XJQ*g[i][j]%XJQ)%=XJQ;printf("%d\n",ans);}
}

P4827-[国家集训队]Crash 的文明世界【树形dp,换根法,斯特林数】相关推荐

  1. P4827 [国家集训队] Crash 的文明世界

    P4827 [国家集训队] Crash 的文明世界 题目描述 Solution 看到这种kkk次幂的式子,就应该往斯特林数的方面想想. mn=∑i{ni}(ni)i!m^n=\sum_i \left\ ...

  2. 『树形DP·换根法』Accumulation Degree

    题目描述 有一个树形的水系,由 N-1 条河道和 N 个交叉点组成. 我们可以把交叉点看作树中的节点,编号为 1~N,河道则看作树中的无向边. 每条河道都有一个容量,连接 x 与 y 的河道的容量记为 ...

  3. P4284-[SHOI2014]概率充电器【树形dp,换根法,数学期望】

    正题 题目链接:https://www.luogu.com.cn/problem/P4284 题目大意 nnn个点的一棵树,每个点有pip_ipi​概率通电,每个边有一定概率可以导电.求期望有电的节点 ...

  4. jzoj3844-统计损失【树形dp,换根法】

    正题 题目链接:https://jzoj.net/senior/#main/show/3844 题目大意 一棵树,求每条路径的点权乘积之和. 解题思路 若只考虑从xxx出发往子树的路径,那么有fx=a ...

  5. bzoj 3743 [Coci2015]Kamp——树形dp+换根

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3743 树形dp+换根. "从根出发又回到根" 减去 "mx & ...

  6. Educational Codeforces Round 67 (Rated for Div. 2)(D思维题 线段树/E树形dp(换根dp) 二次扫描与换根法)

    心得 D写了个假算法被hack了wtcl- E据涛神说是二次扫描与换根法,看了看好像和树形dp差不多 F概率dp G费用流 回头再补 思路来源 马老师 归神 贤神等代码 http://www.mami ...

  7. [题解](树形dp/换根)小x游世界树

    2. 小x游世界树 (yggdrasi.pas/c/cpp) [问题描述] 小x得到了一个(不可靠的)小道消息,传说中的神岛阿瓦隆在格陵兰海的某处,据说那里埋藏着亚瑟王的宝藏,这引起了小x的好奇,但当 ...

  8. 最大疯子树-树形dp+换根+二次扫描

    分析: 疯子树肯定还是一棵树. 所以,所谓的最短路径就是吓唬你的,树上两点之间有且只有一条路径. b1和b2必须是相邻的,否则不可能是一棵疯子树. 再想一想,用同样的方式构造剩下的点的话,那么可以得到 ...

  9. [BZOJ3677/UOJ#105][APIO2014]Beads and wires 连珠线(树形dp+换根)

    Address https://www.lydsy.com/JudgeOnline/problem.php?id=3677 http://uoj.ac/problem/105 Solution 考虑一 ...

最新文章

  1. 2019年上半年收集到的人工智能大神与大咖观点文章
  2. 奖牌分配/Median Pyramid Hard
  3. 如何在柱状图中点连线_练瑜伽,如何放松僵硬紧张的髂腰肌?
  4. python 利用pyttsx3文字转语音 适用于macOS windows树莓派
  5. 利用python脚本(re)抓取美空mm图片
  6. 中文论文万能句型_收藏 | SCI 论文写作的万能句型(二)
  7. 字符串查找strpos()函数用法
  8. [hdu 1003] Max Sum
  9. 《应届生求职笔试全攻略》学习笔记(八)——主要测试类型详解
  10. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_26-页面查询接口测试-Postman...
  11. 案例研究–亚马逊服务中断,数据库崩溃–我们恢复数据库且无数据损失
  12. vscode替换文字快捷键_这 21 个VSCode 快捷键,能让你的代码飞起来
  13. 超级简单C语言进制转换代码
  14. 使用promise封装ajax请求
  15. Hadoop大数据综合案例3-MapReduce数据预处理
  16. SQLMAP注入拖库过程 1
  17. teamtalk mysql.h_新版TeamTalk完整部署教程
  18. 传智播客黑马程序员Java学习笔记(一)
  19. iozone使用简介
  20. exchange虚拟服务器,exchange服务器之为Exchange服务重建IIS虚拟目录

热门文章

  1. 通达学院计算机组成原理试卷及答案,2021全国网络工程专业大学排名(5篇)
  2. python导入文件列行_python读写csv文件并增加行列的实例代码
  3. python 百度ai批量识别_Python基于百度AI的文字识别的示例
  4. leetcode28. 实现 strStr(KMP详解)
  5. leetcode349. 两个数组的交集(思路+详解)
  6. 二叉树的几道相似简单递归题
  7. [PAT乙级]1007 素数对猜想
  8. C++ 简单实现基数排序(list容器)
  9. 十一届蓝桥杯国赛 扩散-多源bfs
  10. AcWing 756. 蛇形矩阵