题目描述

给一棵树,求以每个点为根时下列式子的值。

题解

当k=1时这就是一个经典的换根dp问题。

所以这道题还是要用换根dp解决。

部分分做法:

考虑转移时是这样的一个形式(图是抄的)。

用二项式定理展开就可以nk2做了。

观察到结果是一个xk的形式。

然后这个可以用斯特林数代换。

我们可以先求出每个点的后面的东西,在乘上前面的就是答案了。

这是个组合数,可以用组合数的递推解决。

代码

#include<iostream>
#include<cstdio>
#define N 50009
#define KK 151
using namespace std;
typedef long long ll;
const int mod=10007;
int dp[N][KK],f[KK],h[KK],jie[KK];
int n,m,a[N],tot,head[N],K,s[KK][KK];
inline ll rd(){ll x=0;char c=getchar();bool f=0;while(!isdigit(c)){if(c=='-')f=1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}return f?-x:x;
}
struct edge{int n,to;}e[N<<1];
inline void add(int u,int v){e[++tot].n=head[u];e[tot].to=v;head[u]=tot;e[++tot].n=head[v];e[tot].to=u;head[v]=tot;
}
void dfs(int u,int fa){dp[u][0]=1;for(int i=head[u];i;i=e[i].n)if(e[i].to!=fa){int v=e[i].to;dfs(v,u);(dp[u][0]+=dp[v][0])%=mod;for(int j=1;j<=K;++j)(dp[u][j]+=dp[v][j]+dp[v][j-1])%=mod;}
}
void dfs2(int u,int fa){for(int i=head[u];i;i=e[i].n)if(e[i].to!=fa){int v=e[i].to;for(int j=0;j<=K;++j)f[j]=0;f[0]=dp[u][0]-dp[v][0];for(int j=1;j<=K;++j)(f[j]+=dp[u][j]-dp[v][j-1]-dp[v][j]+mod*2)%=mod;(dp[v][0]+=f[0])%=mod;for(int j=1;j<=K;++j)(dp[v][j]+=f[j]+f[j-1])%=mod;dfs2(v,u);}
}
int main(){n=rd();K=rd();int u,v;for(int i=1;i<n;++i){u=rd();v=rd();add(u,v);}s[0][0]=1;for(int i=1;i<=K;++i){s[i][1]=1;for(int j=2;j<=i;++j)s[i][j]=(s[i-1][j-1]+s[i-1][j]*j)%mod;}jie[0]=1;for(int i=1;i<=K;++i)jie[i]=jie[i-1]*i%mod;dfs(1,0);dfs2(1,0);for(int i=1;i<=n;++i){int ans=0;for(int j=0;j<=K;++j)(ans+=s[K][j]*jie[j]%mod*dp[i][j]%mod)%=mod;printf("%d\n",ans);} return 0;
}

转载于:https://www.cnblogs.com/ZH-comld/p/10265041.html

Crash 的文明世界相关推荐

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

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

  2. BZOJ 2159 「国家集训队」Crash 的文明世界(第二类斯特林数,换根DP)【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2159 是 hydro 的 BZOJ ...

  3. [bzoj2159]Crash 的文明世界

    前言 另一道斯特林数相关的题目,然而可能更考树形dp一些吧 题意简介 题面链接 题目大意 求对于每个点iii的S(i)=∑j=1ndis(i,j)kS(i)=\sum_{j=1}^ndis(i,j)^ ...

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

    正题 题目链接:https://www.luogu.com.cn/problem/P4827 题目大意 一颗nnn个点的树,定义dis(i,j)dis(i,j)dis(i,j)表示树上i,ji,ji, ...

  5. BZOJ2159 Crash 的文明世界 题解

    题目大意:给一棵N个节点的树及正整数K,对每一个节点i求Σdist(i,j)^K.N<=5*10^4,K<=150. O(NK^2),O(NKlogK)的做法都可以在贾志鹏2011年的集训 ...

  6. 王兴的无限游戏和美团的三维文明世界|一点财经

    王兴在饭否的自我介绍中曾提到,"Create like a god".<文明>这款游戏对他世界观影响至深,在这款回合策略制.没有终局的游戏中,玩家可以无限地创造自己的世 ...

  7. 《吴军:科技史纲60讲》走近科技文明世界

    小时候我们会问"我孙悟空真的是石头里蹦出来的吗?"长大了,我们可能会问"是时势造英雄还是英雄造时势?"好奇心是我们探索未知的不懈源泉,是我们发现真理的无穷动力, ...

  8. 《地球以外的文明世界》——阿西莫夫

    1.麦克斯韦与博尔茨曼--气体动力理论结果一,分子的平均速度与绝对稳定成正比,与质量的平方根成反比.    即,同样T下,任一气体分子有v高于其他分子的v,最终超过引力而逃逸,逃逸11.3km/s.月 ...

  9. NOI前总结:点分治

    点分治: 点分治的题目基本一样,都是路径计数. 其复杂度的保证是依靠 $O(n)$ 找重心的,每一次至少将问题规模减小为原先的$1/2$. 找重心我喜欢$BFS$防止爆栈. 1 int Root(in ...

最新文章

  1. 周末思考:浅谈如何成为技术一号位?
  2. 全面认识Eclipse中JVM内存设置
  3. python程序员工作怎样-12个Python程序员面试必备问题与答案(小结)
  4. Hadoop 新 MapReduce 框架 Yarn 详解
  5. JPA时间注解(转)
  6. 【Libevent】Libevent学习笔记(三):事件循环
  7. .NET西安社区 [拥抱开源,又见 .NET] 活动简报
  8. 测视力距离5米还是3米_7岁男孩近视猛涨300度!眼科专家提醒:保护孩子视力这一点很关键...
  9. powershell快捷键_关于powershell的知识你知道多少呢
  10. OpenCV图像处理基础(变换和去噪)
  11. RFC 5961翻译
  12. 代码整洁之道读书笔记----第三章---函数--第一节-专注且短小
  13. vue中echarts3d 使用(3d地图上有柱状图数据,吉林省)
  14. Beyond Compare设置文本文件和Delphi源码默认的打开格式为ANSI
  15. 用U盘给虚拟机装系统——U深度
  16. pyinstaller安装配置--别踩这些keng
  17. android网络测试上传速度慢,【教程】状态栏添加网速 《双排上传速度和下载速度》(转)...
  18. ping命令常用参数
  19. contiki 学习笔记 leds实现部分
  20. 数据结构之KH[第七章] -->选择题 (二)

热门文章

  1. mysql数据库算法_数据库:MySQL索引背后的数据结构及算法原理【转】
  2. Java Set集合
  3. Android 第一课 Activity
  4. 一文读懂vuex4源码,原来provide/inject就是妙用了原型链?
  5. 如何从零开始开发一个 Chrome 插件?
  6. Duboo入门示例(Idea开发环境)
  7. 深入 Adobe Reader 保护模式 —— 第一部分 —— 设计
  8. 安卓操作sqlite3,增删改查
  9. js高级程序设计的笔记(一)
  10. PHP下操作Linux消息队列完成进程间通信的方法