传送门:洛谷

题目大意:设$$S(i)=\sum_{j=1}^ndis(i,j)^k$$,求$S(1),S(2),\ldots,S(n)$。

数据范围:$n\leq 50000,k\leq 150$


这道题,看见$k$次方和就直接上斯特林数。

$$S(x)=\sum_{i=0}^ki!S(k,i)\sum_{y=1}^nC_{dis(x,y)}^i$$

然后我们考虑求最后一项。

设$$up_{x,t}=\sum_{y\notin x}C_{dis(x,y)}^t,dn_{x,t}=\sum_{y\in x}C_{dis(x,y)}^t$$

我们先考虑$dn$。

$$dn_{x,t}=\sum_{(x,v)}\sum_{y\in v}C_{dis(v,y)+1}^t$$

$$=\sum_{(x,v)}\sum_{y\in v}(C_{dis(v,y)}^t+C_{dis(v,y)}^{t-1})$$

$$=\sum_{(x,v)}(dn_{v,t}+dn_{v,t-1})$$

然后考虑$up$

$$up_{x,t}=\sum_{v\notin fa}C_{dis(v,fa)+1}^t+\sum_{v\in fa}C_{dis(v,fa)+1}^t-\sum_{v\in x}C_{dis(v,x)+2}^t$$

$$=up_{fa,t}+up_{fa,t-1}+dn_{fa,t}+dn_{fa,t-1}-dn_{x,t}-2dn_{x,t-1}-dn_{x,t-2}$$

其中$up_{1,t}=0$

然后把式子直接输进去就可以了。

 #include<cstdio>
#define Rint register int
using namespace std;
const int N = , K = , mod = ;
int n, k, head[N], to[N << ], nxt[N << ], S[K][K], fac[K];
inline void add(int a, int b){
static int cnt = ;
to[++ cnt] = b; nxt[cnt] = head[a]; head[a] = cnt;
}
int dn[N][K], up[N][K];
inline void dfs1(int x, int f){
dn[x][] = ;
for(Rint i = head[x];i;i = nxt[i])
if(to[i] != f){
dfs1(to[i], x);
dn[x][] = (dn[x][] + dn[to[i]][]) % mod;
for(Rint t = ;t <= k;t ++)
dn[x][t] = (dn[to[i]][t] + dn[to[i]][t - ] + dn[x][t]) % mod;
}
}
inline void dfs2(int x, int f){
for(Rint i = head[x];i;i = nxt[i])
if(to[i] != f){
up[to[i]][] = (up[x][] + dn[x][] - dn[to[i]][] + mod) % mod;
up[to[i]][] = (up[x][] + up[x][] + dn[x][] + dn[x][] - dn[to[i]][] - * dn[to[i]][] + * mod) % mod;
for(Rint t = ;t <= k;t ++)
up[to[i]][t] = (up[x][t] + up[x][t - ] + dn[x][t] + dn[x][t - ] - dn[to[i]][t] - * dn[to[i]][t - ] - dn[to[i]][t - ] + * mod) % mod;
dfs2(to[i], x);
}
}
int main(){
scanf("%d%d", &n, &k);
S[][] = ;
for(Rint i = ;i <= k;i ++)
for(Rint j = ;j <= k;j ++)
S[i][j] = (S[i - ][j - ] + S[i - ][j] * j) % mod;
fac[] = ;
for(Rint i = ;i <= k;i ++) fac[i] = i * fac[i - ] % mod;
for(Rint i = ;i < n;i ++){
int a, b;
scanf("%d%d", &a, &b);
add(a, b); add(b, a);
}
dfs1(, ); dfs2(, );
for(Rint x = ;x <= n;x ++){
int ans = ;
for(Rint i = ;i <= k;i ++)
ans = (ans + fac[i] * S[k][i] % mod * (up[x][i] + dn[x][i]) % mod) % mod;
printf("%d\n", ans);
}
}

P4827 [国家集训队] Crash 的文明世界的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 解题:国家集训队 Crash 的文明世界

    题面 这种套着高次幂的统计问题一般都要用到第二类斯特林数和自然数幂的关系:$a^k=\sum\limits_{i=0}^{k}S_k^iC_a^i*i!$ 那么对于每个点$x$有: $ans_x=\s ...

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

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

随机推荐

  1. java 汉诺塔实现自动演示

    1.增加计时功能,显示用户完成移动盘子所花费的时间 2.用户可以设置最大和最小盘子的大小 3.用户可以选择播放和暂停背景音乐 4.用户可以设置盘子的数目 5.用户可以设置盘子的颜色以及背景的颜色 6. ...

  2. Windows 下单机最大TCP连接数

    在做Socket 编程时,我们经常会要问,单机最多可以建立多少个 TCP 连接,本文将介绍如何调整系统参数来调整单机的最大TCP连接数. Windows 下单机的TCP连接数有多个参数共同决定,下面一 ...

  3. 给 Advice 传递参数

    参数绑定是在下面这个方法中做的:org.springframework.aop.aspectj.AbstractAspectJAdvice#invokeAdviceMethod(JoinPoint j ...

  4. 大杂烩 -- equals、hashCode联系与区别

    基础大杂烩 -- 目录 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- Equals 1.默认情况(没有覆盖equals方 ...

  5. 艺多不压身 -- 常用缓存Cache机制的实现

    常用缓存Cache机制的实现 缓存,就是将程序或系统经常要调用的对象存在内存中,以便其使用时可以快速调用,不必再去创建新的重复的实例. 这样做可以减少系统开销,提高系统效率. 缓存主要可分为二大类: ...

  6. js中的try/catch

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 保证Activity启动时每次都调用create

    原文:https://stackoverflow.com/questions/41766547/run-oncreate-every-time-android-app-is-opened If you ...

  8. NIO相关概念之Channel

    通道(Channel)是java.nio的第二个主要创新.它们既不是一个扩展也不是一项增强,而是全新.极好的Java I/O示例,提供与I/O服务的直接连接.Channel用于在字节缓冲区和位于通道另 ...

  9. A - ACM Rank Table

    ACM contests, like the one you are participating in, are hosted by the special software. That softwa ...

  10. Windows 10 Install rabbitmq-server-3.6.9

    rabbitmq下载 http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.9/rabbitmq-server-3.6.9.exe otp插件下载 ...