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

题目描述

Solution

看到这种kkk次幂的式子,就应该往斯特林数的方面想想。

mn=∑i{ni}(ni)i!m^n=\sum_i \left\{ \begin{aligned} n \\ i \end{aligned} \right\} \left ( \begin{aligned} n \\ i \end{aligned} \right )i!mn=∑i​{ni​}(ni​)i!

因此
原式原式原式
=∑i,j{ki}(dist(i,j)i)i!=\sum_{i,j} \left\{ \begin{aligned} k \\ i \end{aligned} \right\} \left ( \begin{aligned} dist(i,j) \\ i \;\;\;\;\;\; \end{aligned} \right )i!=∑i,j​{ki​}(dist(i,j)i​)i!
=∑i{ki}i!∑j(dist(i,j)i)=\sum_{i} \left\{ \begin{aligned} k \\ i \end{aligned} \right\}i!\sum_j \left ( \begin{aligned} dist(i,j) \\ i \;\;\;\;\;\; \end{aligned} \right )=∑i​{ki​}i!∑j​(dist(i,j)i​)
=∑i{ki}i!∑j(dist(i,j)−1i)+∑j(dist(i,j)−1i−1)=\sum_{i} \left\{ \begin{aligned} k \\ i \end{aligned} \right\}i!\sum_j \left ( \begin{aligned} dist(i,j)-1 \\ i\;\;\;\;\;\;\;\; \end{aligned} \right )+\sum_j \left ( \begin{aligned} dist(i,j)-1 \\ i-1 \;\;\;\;\;\; \end{aligned} \right )=∑i​{ki​}i!∑j​(dist(i,j)−1i​)+∑j​(dist(i,j)−1i−1​)

因此设F[x][k]F[x][k]F[x][k]表示在xxx的子树内,距离xxx为kkk的所有节点的贡献。
有:
F[x][k]=F[sonx][k−1]+F[sonx][k]F[x][k]=F[son_x][k-1]+F[son_x][k] F[x][k]=F[sonx​][k−1]+F[sonx​][k]
然后换根dpdpdp即可。
时间复杂度O(nk)O(nk)O(nk)。

Code

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <cassert>
#include <string.h>
//#include <unordered_set>
//#include <unordered_map>
//#include <bits/stdc++.h>#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se secondusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; }
template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int,int> PR;
typedef vector<int> VI;const lod eps=1e-11;
const lod pi=acos(-1);
const int oo=1<<30;
const ll loo=1ll<<62;
const int mods=10007;
const int MAXN=100005;
const int INF=0x3f3f3f3f;//1061109567
/*--------------------------------------------------------------------*/
inline int read()
{int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f;
}
vector<int> e[MAXN];
int f[MAXN][155],S[155][155],fac[155],g[155],n,k;
int upd(int x,int y){ return x+y>=mods?x+y-mods:x+y; }
void tree_dp(int x,int father)
{for (auto v:e[x]){if (v==father) continue;tree_dp(v,x);}f[x][0]=1;for (auto v:e[x]) if (v!=father)for (int i=0;i<=k;i++){f[x][i]=upd(f[x][i],f[v][i]);if (i) f[x][i]=upd(f[x][i],f[v][i-1]);}
}
void dfs(int x,int father)
{for (auto v:e[x]){if (v==father) continue;for (int i=0;i<=k;i++){g[i]=upd(f[x][i],mods-f[v][i]);if (i) g[i]=upd(g[i],mods-f[v][i-1]);}for (int i=0;i<=k;i++){f[v][i]=upd(f[v][i],g[i]);if (i) f[v][i]=upd(f[v][i],g[i-1]);}dfs(v,x);}
}
void Init(int k)
{fac[0]=1;for (int i=1;i<=k;i++) fac[i]=fac[i-1]*i%mods;S[0][0]=1;for (int i=1;i<=k;i++) S[i][i]=S[i][1]=1;for (int i=1;i<=k;i++) for (int j=1;j<i;j++) S[i][j]=upd(S[i-1][j-1],S[i-1][j]*j%mods);
}
int main()
{n=read(),k=read();for (int i=1;i<n;i++){int u=read(),v=read();e[u].PB(v);e[v].PB(u);}tree_dp(1,0);dfs(1,0);Init(k);for (int i=1;i<=n;i++){int ans=0;for (int j=1;j<=k;j++) ans=upd(ans,S[k][j]*fac[j]%mods*f[i][j]%mods); printf("%d\n",ans);}return 0;
}

P4827 [国家集训队] Crash 的文明世界相关推荐

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

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

  2. BZOJ 2154 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演,经典好题)(Luogu P1829)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P1829 [国家集训队]Crash的数字表格 / JZPTAB(反演,经典好题) Problem S ...

  3. 【BZOJ2117】 [2010国家集训队]Crash的旅游计划

    [BZOJ2117] [2010国家集训队]Crash的旅游计划 Description 眼看着假期就要到了,Crash由于长期切题而感到无聊了,因此他决定利用这个假期和好友陶陶一起出去旅游. Cra ...

  4. P1829 [国家集训队]Crash的数字表格(推了好久的mobius反演)

    P1829 [国家集训队]Crash的数字表格 / JZPTAB 推导过程 ∑i=1n∑j=1mlcm(i,j)\sum_{i = 1} ^{n} \sum_{j = 1} ^{m} lcm(i, j ...

  5. P1829 [国家集训队]Crash的数字表格 / JZPTAB

    P1829 [国家集训队]Crash的数字表格 / JZPTAB 题意: 求∑i=1n∑j=1mlcm(i,j)\sum_{i=1}^{n}\sum_{j=1}^{m}lcm(i,j)∑i=1n​∑j ...

  6. P1829 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演)

    [国家集训队]Crash的数字表格 / JZPTAB 题目描述 今天的数学课上,Crash 小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数 a a a 和 b b ...

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

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

  8. [2010国家集训队]Crash的旅游计划

    Description 眼看着假期就要到了,Crash由于长期切题而感到无聊了,因此他决定利用这个假期和好友陶陶一起出去旅游. Crash和陶陶所要去的城市里有N (N > 1) 个景点,Cra ...

  9. BZOJ2159 Crash 的文明世界 题解

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

最新文章

  1. 2017-2018中国物联网产业全景图谱报告——物联网对产业深度变革已开启
  2. Android Studio 如何导出和导入自己的常用设置,避免重复制造轮子。加快开发速度...
  3. NumPy之:理解广播
  4. 牛客题霸 判断链表中是否有环 C++题解/答案
  5. 数据类型转换为false的有哪些?
  6. linux dns区域传送,Linux DNS服务器主从复制及区域传送
  7. 各种服务器系统桌面,服务器系统云桌面
  8. 吴恩达机器学习作业Python实现(三):多类分类和前馈神经网络
  9. 邓俊辉数据结构学习-7-BST
  10. 信息时代不被淘汰,获取成功需有的十种能力
  11. Seesharp EasyChartX 常用属性
  12. 数据挖掘技术、方法及应用
  13. ARP欺骗,DNS欺骗和图片嗅探——ettercap软件的使用
  14. 关于民族的数据库表设计
  15. python教程,python小甲鱼
  16. php 判断中文和英文,PHP如何判断中文还是英文?
  17. 脚本防止电脑自动锁屏
  18. 护卫神备份mysql_护卫神好备份系统数据库怎么备份?
  19. 操作系统实验二进程的创建控制实验(含代码及实验心得)
  20. springmvc如何获取CheckBox数据

热门文章

  1. 2020-11-04关于出现tomcat启动失败的一种原因
  2. 第一个发现我嫂子有喜的竟然是......
  3. 几种人类设计的永动机,最后一个彻底服了!| 今日最佳
  4. 《悦趣式连锁反应》玩转STEM教育!529块积木元件,N+1款炫酷模型
  5. 人为什么会出轨?麻省理工学院告诉你:男女配对的真相
  6. php中怎样表示组合框,php – 如何实现动态组合框选择系统
  7. 下班忘打卡了什么后果_工厂园区安装人脸识别门禁系统有什么好处?
  8. 用wamper打开php源码_php源码该怎么设置数据库
  9. python if main_Python:if __name__ == '__main__'
  10. apache 2.4 httpd.conf 详解_Linux Centos服务子系统详解