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

正题

题目链接: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=1ndis(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=0m{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=0m{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=1ndis(i,j)m=j=1n(k=0m{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=1ndis(i,j)m=k=0m{mk}k!j=1n(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)=(m1n1)+(mn1)可以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);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320797.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Helm - Kubernetes服务编排的利器

Helm介绍在Kubernetes中部署容器云应用&#xff08;容器或微服务编排&#xff09;是一项有挑战性的工作&#xff0c;Helm就是为了简化在Kubernetes中安装部署容器云应用的一个客户端工具。通过Helm能够帮助开发者定义、安装和升级Kubernetes中的容器云应用。同时&#xff0c;也…

【DP】优美三角剖分

优美三角剖分 题目大意&#xff1a; 有一个图形&#xff0c;通过组合可以变成新的图形&#xff0c;现在要求第n个图形 原题&#xff1a; 题目描述 小X同学为了搞好和小C同学的关系&#xff0c;特意寻找了一些优美的图像作为礼物。 这是一些由无穷无尽三角形组成的极为优美…

Loj#114-k大异或和【线性基】

正题 题目链接:https://loj.ac/problem/114 题目大意 nnn个数&#xff0c;求所有非空子集的kkk小异或和。 解题思路 我们考虑处理一下线性基&#xff0c;我们知道对于did_idi​是一定在第iii位为111。 对于一个i>ji>ji>j且did_idi​的第jjj位为111时&#xff0c;我…

.NET Core微服务之基于MassTransit实现数据最终一致性(Part 1)

一、预备知识&#xff1a;数据一致性关于数据一致性的文章&#xff0c;园子里已经有很多了&#xff0c;如果你还不了解&#xff0c;那么可以通过以下的几篇文章去快速地了解了解&#xff0c;有个感性认识即可。&#xff08;1&#xff09;左正&#xff0c;《保证分布式系统数据一…

2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017)

D.Distinctive Character 看到样例&#xff0c;第一个反应贪心。先写了个按这一位1和0的数目多少&#xff0c;确定0还是1的东西。感觉不够真&#xff0c;又写了个尽量加到相似的比较小的串上的贪心。在和前边的那个组合一下&#xff0c;换了换顺序。。。好吧就过了13组样例。。…

【二分】买礼物的艰辛

买礼物的艰辛 题目大意&#xff1a; 有n个物品的价格&#xff0c;还有m个人&#xff0c;m个人中的每个人都要购买一定的连续物品&#xff0c;问买下n个物品&#xff0c;花钱最大的人最少花多少钱 原题&#xff1a; 题目描述 小X同学给小C同学选了N件礼物&#xff0c;决定顺…

P4449-于神之怒加强版【莫比乌斯反演】

正题 题目链接:https://www.luogu.com.cn/problem/P4449 题目大意 TTT组询问给出n,mn,mn,m求∑i1n∑j1mgcd(i,j)k\sum_{i1}^n\sum_{j1}^mgcd(i,j)^ki1∑n​j1∑m​gcd(i,j)k 解题思路 ∑i1n∑j1mgcd(i,j)k\sum_{i1}^n\sum_{j1}^mgcd(i,j)^ki1∑n​j1∑m​gcd(i,j)k ∑d1ndk∑i…

Asp.NetCoreWebApi图片上传接口(二)集成IdentityServer4授权访问(附源码)

写在前面本文地址&#xff1a;http://www.cnblogs.com/yilezhu/p/9315644.html作者&#xff1a;yilezhu上一篇关于Asp.Net Core Web Api图片上传的文章使用的是mongoDB进行图片的存储&#xff0c;文章发布后&#xff0c;张队就来了一句&#xff0c;说没有使用GridFS。的确博主只…

Codeforces40E[Number Table]

Codeforces40E[Number Table] 解法一&#xff0c;如果有一维很小&#xff0c;可以考虑状压dp之类的&#xff0c;显然非常不优秀。 解法二&#xff0c;如果n*m较小&#xff0c;可以考虑&#xff0c;设出每个位置是否为-1&#xff0c;解xor线性方程组。再bitset优化一下之类的。然…

【DP】天平问题

天平问题 解题思路&#xff1a; 有n个砝码&#xff0c;问可以称出多少种重量&#xff0c;可以在左边或者右边放&#xff0c;也可以不放 原题&#xff1a; 题目描述 小C为了试验小X&#xff0c;便为物竞的小X出了一道物理相关的题&#xff1a;现在给出n个质量的砝码&#x…

.NET Core开发日志——从ASP.NET Core Module到KestrelServer

ASP.NET Core程序现在变得如同控制台(Console)程序一般&#xff0c;同样通过Main方法启动整个应用。而Main方法要做的事情很简单&#xff0c;创建一个WebHostBuilder类&#xff0c;调用其Build方法生成一个WebHost类&#xff0c;最后启动之。实现代码一目了然&#xff1a;要想探…

BZOJ5358: [Lydsy1805月赛]口算训练

题解&#xff1a;判断d是否整除&#xff0c;可以转化为求这段区间内d的因子的指数是否均大于d中的指数。容易想到把每个数字都分解为素因子形式&#xff0c;对每个素数出现的次数求个前缀和即可。然而&#xff0c;这样时间空间都不行。注意到对于一个数x&#xff0c;小于sqrt(x…

jzoj6800-NOIP2020.9.19模拟spongebob【枚举】

正题 题目链接:https://gmoj.net/senior/#contest/show/3222/0 题目大意 nnn个ai,bia_i,b_iai​,bi​&#xff0c;求一个xxx使得最小化∑i1n∣aixbi∣\sum_{i1}^n|a_ixb_i|i1∑n​∣ai​xbi​∣ 解题思路 每个∣aixbi∣|a_ixb_i|∣ai​xbi​∣可以视为一个分两段的函数&#…

【bfs】极其简单的最短路问题

极其简单的最短路问题 题目大意&#xff1a; 求最短路&#xff0c;权值只有1或2 原题&#xff1a; 题目描述 小C终于被小X感动了&#xff0c;于是决定与他看电影&#xff0c;然而小X距离电影院非常远&#xff0c;现在假设每条道路需要花费小X的时间为1&#xff0c;由于有数…

GraphQL 的前世今生

GraphQL是什么GraphQL是一种新的API标准&#xff0c;它提供了一种更高效、强大和灵活的数据提供方式。它是由Facebook开发和开源&#xff0c;目前由来自世界各地的大公司和个人维护。GraphQL本质上是一种基于api的查询语言&#xff0c;现在大多数应用程序都需要从服务器中获取数…

jzoj6801-NOIP2020.9.19模拟patrick【树状数组】

正题 题目大意 nnn个连续的数&#xff0c;第iii个为hih_ihi​。有操作 给出一个HHH&#xff0c;询问大于等于HHH的数能组成多少个联通块修改一个位置的数。 解题思路 考虑计算连通块尾的数量&#xff0c;我们可以发现一个位置作为联通块尾部当且仅当hi≥Hh_i\geq Hhi​≥H且h…

Codeforces Round #485 (Div. 2)

Codeforces986B [Petr and Permutations] 看到两个随机的swap次数&#xff0c;很容易想到跟奇偶性有关。然后就凉了。赛后思考了一下&#xff0c;这个思路应该没问题&#xff0c;那就需要考虑swap的奇偶性与排列的关系。因此&#xff0c;我们考虑如何把两个不相邻数的swap&…

初一模拟赛总结(5.18)

成绩&#xff1a; rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4111lyflyflyf210210210505050606060303030707070111hkyhkyhky210210210100100100404040000707070333wjjwjjwjj190190190100100100000000909090444fyfyfy170170170100100100000000707070555tj…

Codeforces Round #486 (Div. 3)

E. Divisibility by 25 能被25整除的充要条件就是末两位是00&#xff0c;25&#xff0c;50&#xff0c;75。如果没有过程中不出现前导0这一限制&#xff0c;显然对每种情况&#xff0c;贪心取尽量低位即可。本题的关键就在于如何满足这个条件&#xff0c;首先有个”显然”的方法…

C#:如何将坏的代码重新编译为好的代码

自己的前言说明&#xff1a;本文原作者&#xff1a;Radoslaw Sadowski&#xff0c;原文链接为&#xff1a;C# BAD PRACTICES: Learn how to make a good code by bad example。本系列还有其他文章&#xff0c;后续将慢慢翻译。引言&#xff1a;我的名字叫Radoslaw Sadowski&…