[LuoguP1829]Crash的文明表格(二次扫描与换根+第二类斯特林数)

本文主要是介绍[LuoguP1829]Crash的文明表格(二次扫描与换根+第二类斯特林数),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

a.png

Solution:

​ 由于
\[ x^m = \sum_{i=0}^m{~m~\choose i}{~x~\brace i}i! \]
​ 将所求的式子化成这样,挖掘其性质,考虑是否能从儿子转移(或利用以求得信息)。
\[ \begin{aligned} S(u) &= \sum_{i=1}^ndis(u,i)^k\\ &= \sum_{i=1}^n\sum_{j=0}^k{dis(u, i) \choose j}{k\brace j}j!\\ &= \sum_{j=0}^kj!{k\brace j}\sum_{i=1}^n{dis(u, i)\choose j} \end{aligned} \]
​ 由于组合数有:\({n\choose m} = {n - 1\choose m - 1} + {n - 1\choose m}\)

​ 而从儿子及父亲到自己的距离为1,于是可以考虑换根树型dp求出每个点的 \(\sum_{i=1}^n{dis(u, i)\choose j}\)

​ 设 \(f[u][j] = \sum_{i}{dis(u, i) \choose j}\) 其中 \(i\)\(u\) 子树中的点。

​ 设 \(g[u][j] = \sum_{i=1}^n{dis(u, i)\choose j}\)
\[ f[u][j] = \sum_{v\in son(u)}f[v][j] + f[v][j - 1]\\ g[u][j] = g[fa(u)][j-1]-f[u][j-2]-f[u][j-1]+g[fa(u)][j]-f[u][j-1]-f[u][j]+f[u][j] \]

Code

#include <vector>
#include <cmath>
#include <cstdio>
#include <cassert>
#include <cstring>
#include <iostream>
#include <algorithm>typedef long long LL;
typedef unsigned long long uLL;#define fir first
#define sec second
#define SZ(x) (int)x.size()
#define MP(x, y) std::make_pair(x, y)
#define PB(x) push_back(x)
#define debug(...) fprintf(stderr, __VA_ARGS__)
#define GO debug("GO\n")
#define rep(i, a, b) for (register int i = (a), i##end = (b); (i) <= i##end; ++ (i))
#define drep(i, a, b) for (register int i = (a), i##end = (b); (i) >= i##end; -- (i))
#define REP(i, a, b) for (register int i = (a), i##end = (b); (i) < i##end; ++ (i))inline int read() {register int x = 0; register int f = 1; register char c;while (!isdigit(c = getchar())) if (c == '-') f = -1;while (x = (x << 1) + (x << 3) + (c xor 48), isdigit(c = getchar()));return x * f;
}
template<class T> inline void write(T x) {static char stk[30]; static int top = 0;if (x < 0) { x = -x, putchar('-'); }while (stk[++top] = x % 10 xor 48, x /= 10, x);while (putchar(stk[top--]), top);
}
template<typename T> inline bool chkmin(T &a, T b) { return a > b ? a = b, 1 : 0; }
template<typename T> inline bool chkmax(T &a, T b) { return a < b ? a = b, 1 : 0; }using namespace std;const int maxN = 50004;
const int maxK = 153;
const int MOD = 10007;int n, k;
int fac[maxK];
int stirl[maxK][maxK];
vector<int> ver[maxN];void Input()
{n = read(), k = read();for (int i = 1; i < n; ++i){int u = read(), v = read();ver[u].push_back(v);ver[v].push_back(u);}
}void Init() 
{fac[0] = 1;rep (i, 1, k) fac[i] = 1ll * fac[i - 1] * i % MOD;stirl[0][0] = stirl[1][1] = 1;rep (i, 2, k)rep (j, 1, i) stirl[i][j] = (1ll * stirl[i - 1][j - 1] + 1ll * j * stirl[i - 1][j] % MOD) % MOD;
}int f[maxN][maxK], g[maxN][maxK], tmp[maxK];void dfs1(int u, int fa)
{f[u][0] = 1;for (int v : ver[u]) if (v != fa){dfs1(v, u);f[u][0] = (1ll * f[u][0] + f[v][0]) % MOD;for (int j = 1; j <= k; ++j)f[u][j] = ((1ll * f[u][j] + f[v][j]) % MOD + f[v][j - 1]) % MOD;}
}void add(int &x, int y)
{x = (1ll * x + y + MOD) % MOD;
}void dfs2(int u, int fa)
{if (!fa) for (int i = 0; i <= k; ++i) g[u][i] = f[u][i];else {g[u][0] = g[fa][0];for (int j = 1; j <= k; ++j){int &x = g[u][j];x = 0;add(x, g[fa][j]);add(x, -f[u][j]);add(x, -f[u][j - 1]);add(x, g[fa][j - 1]);add(x, -f[u][j - 1]);add(x, f[u][j]);if (j >= 2) add(x, -f[u][j - 2]);}}for (int v : ver[u])if (v != fa)dfs2(v, u);
}void Solve()
{dfs1(1, 0);dfs2(1, 0);for (int i = 1; i <= n; ++i){int ans = 0;for (int j = 0; j <= k; ++j)ans = (1ll * ans + 1ll * stirl[k][j] * fac[j] % MOD * g[i][j] % MOD) % MOD;cout << ans << endl;}
}int main() 
{
#ifndef ONLINE_JUDGEfreopen("tmp.in", "r", stdin);freopen("tmp.out", "w", stdout);
#endifInput();Init();Solve();return 0;
}

转载于:https://www.cnblogs.com/cnyali-Tea/p/11439945.html

这篇关于[LuoguP1829]Crash的文明表格(二次扫描与换根+第二类斯特林数)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/247200

相关文章

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

Java Web实现类似Excel表格锁定功能实战教程

《JavaWeb实现类似Excel表格锁定功能实战教程》本文将详细介绍通过创建特定div元素并利用CSS布局和JavaScript事件监听来实现类似Excel的锁定行和列效果的方法,感兴趣的朋友跟随... 目录1. 模拟Excel表格锁定功能2. 创建3个div元素实现表格锁定2.1 div元素布局设计2.

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元

使用Python实现网页表格转换为markdown

《使用Python实现网页表格转换为markdown》在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,本文将使用Python编写一个网页表格转Markdown工具,需... 在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,以便在文档、邮件或

Python实现pdf电子发票信息提取到excel表格

《Python实现pdf电子发票信息提取到excel表格》这篇文章主要为大家详细介绍了如何使用Python实现pdf电子发票信息提取并保存到excel表格,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录应用场景详细代码步骤总结优化应用场景电子发票信息提取系统主要应用于以下场景:企业财务部门:需

Python实现获取带合并单元格的表格数据

《Python实现获取带合并单元格的表格数据》由于在日常运维中经常出现一些合并单元格的表格,如果要获取数据比较麻烦,所以本文我们就来聊聊如何使用Python实现获取带合并单元格的表格数据吧... 由于在日常运维中经常出现一些合并单元格的表格,如果要获取数据比较麻烦,现将将封装成类,并通过调用list_exc

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

python获取网页表格的多种方法汇总

《python获取网页表格的多种方法汇总》我们在网页上看到很多的表格,如果要获取里面的数据或者转化成其他格式,就需要将表格获取下来并进行整理,在Python中,获取网页表格的方法有多种,下面就跟随小编... 目录1. 使用Pandas的read_html2. 使用BeautifulSoup和pandas3.

HTML5表格语法格式详解

《HTML5表格语法格式详解》在HTML语法中,表格主要通过table、tr和td3个标签构成,本文通过实例代码讲解HTML5表格语法格式,感兴趣的朋友一起看看吧... 目录一、表格1.表格语法格式2.表格属性 3.例子二、不规则表格1.跨行2.跨列3.例子一、表格在html语法中,表格主要通过< tab