Description

给定一棵\(n\le 10^5\)的树, 和\(k\le 150\)

求每个点\(x\)的$$S(x) = \sum_{y=1}^n dis(x, y) ^ k$$

Analysis

k比较小, 考虑斯特林展开

\[\begin{aligned}
S(x) &= \sum_{y=1}^n dis(x, y)^k\\
&=\sum_{y=1}^n \sum_{i=0}^k \left\{\begin{matrix}k\\i\end{matrix}\right\} i!\binom{dis(x,y)}{i}\\
&=\sum_{i=0}^k \left\{\begin{matrix}k\\i\end{matrix}\right\} i! \sum_{y=1}^n \binom{dis(x,y)}{i}\\
\end{aligned}
\]

考虑求后面的部分, 可以上下树形dp一下

记$$f[x][i] = \sum_{y\in sub(x)} \binom{dis(x, y)}{i}$$

那么$$f[x][i] = \sum_{y\in son(x)} f[y][i] + [i>0]f[y][i-1]$$

即利用$$\Delta \binom x c = \binom x {c-1}$$

这题只用暴力转移组合数一次

Code

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cctype>
#define rep(i,a,b) for (int i = (a); i <= (b); ++ i)
#define per(i,a,b) for (int i = (a); i >= (b); -- i)
#define For(i,a,b) for (int i = (a); i < (b); ++ i)
using namespace std;
const int N = 5e4 + 7;
const int M = 157;
const int Q = 10007; inline int ri(){
int x = 0; bool f = 1; char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') f = 0;
for (; isdigit(c); c = getchar()) x = x*10+c-48;
return f ? x : -x;
} inline int pls(int x, int y) {return (x + y) % Q;}
inline int mns(int x, int y) {return pls(x, Q - y);}
inline int mul(int x, int y) {return x * y % Q;} int n, m;
int fac[M], S2[M][M];
int f[N][M], g[N][M];
int ans[N]; struct vec {
int g[N], te;
struct edge{int y, nxt;}e[N << 1];
inline void push(int x, int y) {e[++te] = (edge){y, g[x]}; g[x] = te;}
inline void push2(int x, int y) {push(x, y); push(y, x);}
inline int& operator () (int x) {return g[x];}
inline edge& operator [] (int x) {return e[x];}
}e; void upd(int *A, int *B, int kd = 1) {
if (kd == 1) {
rep (i, 0, m) A[i] = pls(A[i], B[i]);
rep (i, 1, m) A[i] = pls(A[i], B[i-1]);
}
if (kd == -1) {
rep (i, 0, m) A[i] = mns(A[i], B[i]);
rep (i, 1, m) A[i] = mns(A[i], B[i-1]);
}
} void UP(int x, int fa) {
int p, y; rep (i, 0, m) ans[x] = pls(ans[x], mul(S2[m][i], pls(g[x][i], f[x][i]))); for (p=e(x); p; p=e[p].nxt)
if ((y=e[p].y) != fa) {
upd(f[x], f[y], -1); upd(g[y], f[x]);
upd(g[y], g[x]);
UP(y, x); upd(f[x], f[y]);
}
} void DW(int x, int fa) {
int p, y;
for (p=e(x); p; p=e[p].nxt)
if ((y=e[p].y) != fa) {
DW(y, x);
upd(f[x], f[y]);
}
f[x][0] = pls(f[x][0], 1); // d(x, x) = 0
} void Uncompress() {
int L, i, now, A, B, mod, tmp;
scanf("%d%d%d", &n, &m, &L);
scanf("%d%d%d%d", &now, &A, &B, &mod);
for (i = 1; i < n; i ++) {
now = (now * A + B) % mod;
tmp = (i < L) ? i : L;
e.push2(i - now % tmp, i + 1);
}
} int main() {
#ifndef ONLINE_JUDGE
freopen("a.in", "r", stdin);
#endif Uncompress(); int i, j;
for (fac[0] = 1, i=1; i<=m; ++i) fac[i] = mul(fac[i-1], i); for (S2[0][0] = 1, i=1; i<=m; ++i)
for (j=1; j<=i; ++j) S2[i][j] = pls(mul(j, S2[i-1][j]), S2[i-1][j-1]);
rep (i, 0, m) rep (j, 0, i) S2[i][j] = mul(S2[i][j], fac[j]); DW(1, 0);
UP(1, 0); rep (i, 1, n) printf("%d\n", ans[i]); return 0;
}

bzoj 2159 - Crash 的 文明世界的更多相关文章

  1. bzoj 2159: Crash 的文明世界

    Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 480  Solved: 234[Submit][Status][Discuss] Descripti ...

  2. BZOJ.2159.Crash的文明世界(斯特林数 树形DP)

    BZOJ 洛谷 挺套路但并不难的一道题 \(Description\) 给定一棵\(n\)个点的树和\(K\),边权为\(1\).对于每个点\(x\),求\(S(x)=\sum_{i=1}^ndis( ...

  3. BZOJ 2159: Crash 的文明世界(树形dp+第二类斯特林数+组合数)

    题意 给定一棵 \(n\) 个点的树和一个常数 \(k\) , 对于每个 \(i\) , 求 \[\displaystyle S(i) = \sum _{j=1} ^ {n} \mathrm{dist ...

  4. bzoj 2159 Crash 的文明世界 && hdu 4625 JZPTREE ——第二类斯特林数+树形DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2159 学习材料:https://blog.csdn.net/litble/article/d ...

  5. bzoj 2159 Crash 的文明世界 & hdu 4625 JZPTREE —— 第二类斯特林数+树形DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2159 使用公式:\( n^{k} = \sum\limits_{i=0}^{k} S(k,i ...

  6. [bzoj 2159]Crash的文明世界

    今天看到一个鬼题 心情好的时候写 [题意]求树上所有点对距离的k次方和,所有边权为1 大爷方的题解:http://tonyfang.is-programmer.com/posts/204972.htm ...

  7. BZOJ 2159: Crash 的文明世界 第二类斯特林数+树形dp

    这个题非常巧妙啊~ #include <bits/stdc++.h> #define M 170 #define N 50003 #define mod 10007 #define LL ...

  8. BZOJ 2159: Crash 的文明世界(组合数学+第二类斯特林数+树形dp)

    传送门 解题思路 比较有意思的一道数学题.首先\(n*k^2\)的做法比较好想,就是维护一个\(x^i\)这种东西,然后转移的时候用二项式定理拆开转移.然后有一个比较有意思的结论就是把求\(x^i\) ...

  9. 【BZOJ2159】Crash的文明世界(第二类斯特林数,动态规划)

    [BZOJ2159]Crash的文明世界(第二类斯特林数,动态规划) 题面 BZOJ 洛谷 题解 看到\(k\)次方的式子就可以往二项式的展开上面考,但是显然这样子的复杂度会有一个\(O(k^2)\) ...

随机推荐

  1. 【Effective C++ 读书笔记】条款02: 尽量以 const, enum, inline 替换 #define

    条款02: 尽量以 const, enum, inline 替换 #define 这个条款或许可以改为“宁可以编译器替换预处理器”. 编译过程: .c文件--预处理-->.i文件--编译--&g ...

  2. PHP.24-TP框架商城应用实例-后台1-添加商品功能、钩子函数、在线编辑器、过滤XSS、上传图片并生成缩略图

    添加商品功能 1.创建商品控制器[C] /www.test.com/shop/Admin/Controller/GoodsController.class.php <?php namespace ...

  3. linux中jdk的安装与mysql 的安装

    1.linux安装jdk #先找到 安装包#cd /usr/java tar -zxvf jdk-8u31-linux-x64.tar.gz 2.安装选择要安装java的位置,如/usr/目录下,新建 ...

  4. javaScript对SEO的影响

    在两大搜索引擎阵营中,大量实践证明百度对JAVASCRIP的处理很不理想而GOOGLE的处理要好一些.   网页中出现大量的JavaScript会给搜索引擎爬行增加难度.其主要影响有以下几点: 1.干 ...

  5. sqlsever存储过程学习笔记

    1,创建数据表 use test create table money( id ,) primary key, money int, monetary_unity char ); 2,考虑到货币单位的 ...

  6. error LNK2001: unresolved external symbol @__security_check_cookie

    Q:VS2005编译的静态库, 在vc++6.0中连接出现错误 error LNK2001: unresolved external symbol @__security_check_cookie@l ...

  7. centos使用--centos7.3配置LNMP

    目录 1 源的配置 2 安装软件 2.1 安装php7 2.2 安装nginx 2.3 安装mysql 2.4 安装vsftp (ftp登录配置) 3 开机启动设置 4 其它一些配置 4.1 git的 ...

  8. Hyper-V在线调整虚拟硬盘大小

    从Windows Server 2012 R2 开始,可以在线调整虚拟硬盘的大小了,这意味着当虚拟硬盘不够用时,我们在虚拟机运行的情况下直接扩展虚拟硬盘容量了.有人说这个有什么用?当然,实验室情况下, ...

  9. oracle集群部署相关文章

    1. Oracle数据库HA架构方案介绍:http://blog.sina.com.cn/s/blog_7273b6cc0100p0sr.html 2.Oracle 集群概念和原理

  10. 剑指Offer - 九度1368 - 二叉树中和为某一值的路径

    剑指Offer - 九度1368 - 二叉树中和为某一值的路径2013-11-23 03:46 题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结 ...