题面

这种套着高次幂的统计问题一般都要用到第二类斯特林数和自然数幂的关系:$a^k=\sum\limits_{i=0}^{k}S_k^iC_a^i*i!$

那么对于每个点$x$有:

$ans_x=\sum\limits_{i=0}^k S_{k}^i C_{\sum dis(x,j)}^i i!$

问题变成求$C_{\sum dis(x,j)}^i$,神仙告诉我们,这个东西要DP求

为什么要DP求?先往下看

那么就设$dp[i][k]$表示以i为根的子树里$C_{\sum dis(i,j)}^k$的值,$pd[i][k]$表示以$i$为根的子树外......的值

$dp$数组是符合我们常做的树形DP的思路的,先看这个

转移当然是从儿子合并啦:

$dp[i][k]=C_{\sum dis(i,j)}^k$

$=C_{\sum dis(son,j)+1}^k+[k==0]$

好,现在回答为什么要DP?因为根据组合数的性质$C_n^m=C_{n-1}^m+C_{n-1}^{m-1}$,这里可以直接转移

$=C_{\sum dis(son,j)}^k+C_{\sum dis(son,j)}^{k-1}+[k==0]$

$=dp[son][k]+dp[son][k-1]+[k==0]$

这样一来就可以从父亲往下转移求$pd$了,下面用$C'$表示从父亲转移过来时的组合数(区别于子树)

$dp[i][k]={C'}_{\sum dis(i,j)}^k$

$={C'}_{\sum dis(fth,j)+1}^k+C_{\sum dis(fth,j)+1}^k-C_{\sum dis(i,j)+1}^k$

爆拆一通得到:

$=pd[fth][k]+pd[fth][k-1]+dp[fth][k]+dp[fth][k-1]-dp[i][k]-2*dp[i][k-1]-dp[i][k-2]$

于是做完了

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,M=,mod=;
int n,k,t1,t2,cnt;
int fac[N],inv[N],st2[M][M];
int p[N],noww[*N],goal[*N];
long long dp[N][M],pd[N][M];
void Add(long long &x,int y)
{
x+=y;
if(x>=mod) x-=mod;
}
int C(int n,int m)
{
return n<m?:1ll*fac[n]*inv[m]%mod*inv[n-m]%mod;
}
int Qpow(int x,int k)
{
if(k==) return x;
int tmp=Qpow(x,k/);
return k%?1ll*tmp*tmp%mod*x%mod:1ll*tmp*tmp%mod;
}
void Link(int f,int t)
{
noww[++cnt]=p[f];
goal[cnt]=t,p[f]=cnt;
noww[++cnt]=p[t];
goal[cnt]=f,p[t]=cnt;
}
void Pre()
{
fac[]=inv[]=,st2[][]=;
for(int i=;i<=k;i++)
for(int j=;j<=k;j++)
st2[i][j]=(st2[i-][j-]+1ll*st2[i-][j]*j%mod)%mod;
for(int i=;i<=k;i++)
fac[i]=1ll*fac[i-]*i%mod;
inv[k]=Qpow(fac[k],mod-);
for(int i=k-;i;i--)
inv[i]=1ll*inv[i+]*(i+)%mod;
}
void Gettre(int nde,int fth)
{
dp[nde][]=;
for(int i=p[nde],g;i;i=noww[i])
if(goal[i]!=fth)
{
Gettre(g=goal[i],nde);
Add(dp[nde][],dp[g][]);
for(int j=;j<=k;j++)
Add(dp[nde][j],(dp[g][j]+dp[g][j-])%mod);
}
}
void Getanc(int nde,int fth)
{
if(nde!=)
{
for(int i=;i<=k;i++)
{
pd[nde][i]=pd[fth][i]+dp[fth][i]-dp[nde][i];
if(i>=) pd[nde][i]+=pd[fth][i-]+dp[fth][i-]-*dp[nde][i-];
if(i>=) pd[nde][i]-=dp[nde][i-]; pd[nde][i]=(pd[nde][i]%mod+mod)%mod;
}
}
for(int i=p[nde];i;i=noww[i])
if(goal[i]!=fth) Getanc(goal[i],nde);
}
int main()
{
scanf("%d%d",&n,&k),Pre();
for(int i=;i<n;i++)
scanf("%d%d",&t1,&t2),Link(t1,t2);
Gettre(,),Getanc(,);
for(int i=;i<=n;i++)
{
long long ans=;
for(int j=;j<=k;j++)
Add(ans,1ll*st2[k][j]*fac[j]%mod*(dp[i][j]+pd[i][j])%mod);
printf("%lld\n",ans);
}
return ;
}

解题:国家集训队 Crash 的文明世界的更多相关文章

  1. [国家集训队] Crash 的文明世界(第二类斯特林数)

    题目 [国家集训队] Crash 的文明世界 前置 斯特林数\(\Longrightarrow\)斯特林数及反演总结 做法 \[\begin{aligned} ans_x&=\sum\limi ...

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

    Description 给定一棵 \(n\) 个点的树,对于每个点 \(i\) 求 \(S(i)=\sum\limits_{j=1}^n \operatorname{dist(i,j)}^k\) .\ ...

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

    不错的树形$ DP$的题 可为什么我自带大常数啊$ cry$ 链接:here 题意:给定一棵$ n$个节点的树,边权为$ 1$,对于每个点$ x$求$ \sum\limits_{i=1}^n dist ...

  4. 洛谷P4827 [国家集训队] Crash 的文明世界 [斯特林数,组合数,DP]

    传送门 思路 又见到这个\(k\)次方啦!按照套路,我们将它搞成斯特林数: \[ ans_x=\sum_{i=0}^k i!S(k,i)\sum_y {dis(x,y) \choose i} \] 前 ...

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

    传送门:洛谷 题目大意:设$$S(i)=\sum_{j=1}^ndis(i,j)^k$$,求$S(1),S(2),\ldots,S(n)$. 数据范围:$n\leq 50000,k\leq 150$ ...

  6. 【[国家集训队] Crash 的文明世界】

    先写一个五十分的思路吧 首先这道题有一个弱化版 [POI2008]STA-Station 相当于\(k=1\),于是就是一个非常简单的树形\(dp\)的\(up\ \ and\ \ down\)思想 ...

  7. P4827 [国家集训队] Crash 的文明世界(第二类斯特林数+树形dp)

    传送门 对于点\(u\),所求为\[\sum_{i=1}^ndis(i,u)^k\] 把后面那堆东西化成第二类斯特林数,有\[\sum_{i=1}^n\sum_{j=0}^kS(k,j)\times ...

  8. 国家集训队 Crash 的文明世界(第二类斯特林数+换根dp)

    题意 ​ 题目链接:https://www.luogu.org/problem/P4827 ​ 给定一棵 \(n\) 个节点的树和一个常数 \(k\) ,对于树上的每一个节点 \(i\) ,求出 \( ...

  9. 洛谷 P4827 [国家集训队] Crash 的文明世界

    题目描述 ​ 给你一棵 n 个点的树,对于树上的每个节点 i,求 \(\sum_{j=1}^ndis(i,j)^k\).其中 \(dis(i,j)\) 为两点在树上的距离. 输入格式 ​ 第一行两个整 ...

随机推荐

  1. 【spring】spirng中的常用工具类

    一.概述 很多时候,很多工具类其实spring中就已经提供,常用的工具类有: 参考:https://www.cnblogs.com/langtianya/p/3875103.html 内置的resou ...

  2. libgdx学习记录6——动作Action

    libgdx中的Action类能够有效的帮助我们实现位移.旋转.缩放.淡入淡出等效果,对游戏的设计很有用. Action是一个抽象类,本身不可以实例化.一般使用的它的继承类,常用的有 MoveToAc ...

  3. 定制 input[type="radio"] 和 input[type="checkbox"] 样式

    表单中,经常会使用到单选按钮和复选框,但是,input[type="radio"] 和 input[type="checkbox"] 的默认样式在不同的浏览器或 ...

  4. 蓝牙学习笔记三(Android Debug)

    android 端可以通过两种方式去Debug: 一.在手机的设置功能里,开发者模式 Enable,如下图:   http://blog.bluetooth.com/debugging-bluetoo ...

  5. 微信小程序实现各种特效实例

    写在前面 最近在负责一个微信小程序的前端以及前后端接口的对接的项目,整体上所有页面的布局我都已经搭建完成,里面有一些常用的特效,总结一下,希望对大家和我都能有所帮助 实例1:滚动tab选项卡 先看一下 ...

  6. python3面向对象注意事项

    一.面向对象super的作用: class parent(object): def __init__(self): self.test() def test(self): print('parent- ...

  7. saltstack-----master迁移篇

    打包/etc/salt/下的pki文件夹.发送到新的master,然后更改minion的hosts,重启minion,最后重启新master..搞定(salt "*" servic ...

  8. Hadoop版本的选择问题

    自从2013年下半年开始,hadoop的版本开始了快速的更新换代,这和通信和互联网行业(ICT)的发展是密切相关的.随着移动网络的和宽带网络的覆盖以及数据传输速率的提升,线上的数据有了爆炸式的增长.这 ...

  9. PAT甲题题解-1125. Chain the Ropes (25)-贪心水题

    贪心水题,每次取最短的两个绳子合并,长度缩减成一半 #include <iostream> #include <cstdio> #include <algorithm&g ...

  10. Final互评------《I do》---- 二次元梦之队

    一.基于NABCD评论作品,及改进建议 1.根据(不限于)NABCD评论作品的选题; N(Need,需求):该产品是一款休闲类的解密游戏,背景是编程知识.作为一款休闲游戏,有着基本的娱乐功能,可以给用 ...