[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

相关文章

Prompt - 将图片的表格转换成Markdown

Prompt - 将图片的表格转换成Markdown 0. 引言1. 提示词2. 原始版本 0. 引言 最近尝试将图片中的表格转换成Markdown格式,需要不断条件和优化提示词。记录一下调整好的提示词,以后在继续优化迭代。 1. 提示词 英文版本: You are an AI assistant tasked with extracting the content of

vue2实践:el-table实现由用户自己控制行数的动态表格

需求 项目中需要提供一个动态表单,如图: 当我点击添加时,便添加一行;点击右边的删除时,便删除这一行。 至少要有一行数据,但是没有上限。 思路 这种每一行的数据固定,但是不定行数的,很容易想到使用el-table来实现,它可以循环读取:data所绑定的数组,来生成行数据,不同的是: 1、table里面的每一个cell,需要放置一个input来支持用户编辑。 2、最后一列放置两个b

关于使用cspreadsheet读写EXCEL表格数据的问题

前几天项目有读写EXCEL表格的需求,我就找了大概有几种,大致分为:COM方法、ODBC方法、OLE方法、纯底层格式分析方法。由于COM方法要求必须安装有OFFICE的EXCEL组件,纯底层格式分析方法又很多功能需要自行去完善,所有最终选择了数据库的方法,用数据库的方法去存取xls格式的数据。网上有一个高手写的CSpreedSheet,看了一下提供的接口,感觉挺好用的。在使用的过程中发现几个

一些数学经验总结——关于将原一元二次函数增加一些限制条件后最优结果的对比(主要针对公平关切相关的建模)

1.没有分段的情况 原函数为一元二次凹函数(开口向下),如下: 因为要使得其存在正解,必须满足,那么。 上述函数的最优结果为:,。 对应的mathematica代码如下: Clear["Global`*"]f0[x_, a_, b_, c_, d_] := (a*x - b)*(d - c*x);(*(b c+a d)/(2 a c)*)Maximize[{f0[x, a, b,

独立按键单击检测(延时消抖+定时器扫描)

目录 独立按键简介 按键抖动 模块接线 延时消抖 Key.h Key.c 定时器扫描按键代码 Key.h Key.c main.c 思考  MultiButton按键驱动 独立按键简介 ​ 轻触按键相当于一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通与断开。  ​ 按键抖动 由于按键内部使用的是机

自动化表格处理的革命:智能文档系统技术解析

在当今数据驱动的商业环境中,表格数据的自动化处理成为了企业提高效率、降低成本的关键。企业智能文档系统在智能表格识别方面展现出卓越的性能,通过精准识别和处理各种通用表格,显著提升了企业文档管理的智能化水平。本文将深入探讨该系统在表格识别方面的关键技术和应用优势,以及如何通过行业定制化服务满足不同行业的需求。 1. 通用表格识别 智能文档系统通过先进的OCR技术和表格结构识别算法,能够精准

【线性代数】正定矩阵,二次型函数

本文主要介绍正定矩阵,二次型函数,及其相关的解析证明过程和各个过程的可视化几何解释(深蓝色字体)。 非常喜欢清华大学张颢老师说过的一段话:如果你不能用可视化的方式看到事情的结果,那么你就很难对这个事情有认知,认知就是直觉,解析的东西可以让你理解,但未必能让你形成直觉,因为他太反直觉了。 正定矩阵 定义 给定一个大小为 n×n 的实对称矩阵 A ,若对于任意长度为 n 的非零向量 ,有 恒成

python读取pdf内容写入到Excel表格中

要从每个 PDF 文件中提取全文内容,并将这些内容粘贴到一个新的或现有的表格中,你可以使用 Python 的库来完成这一任务。以下是一个简化的步骤和示例代码,展示如何实现这个过程。 步骤概述 读取文件夹中的所有 PDF 文件。提取每个 PDF 文件的全文内容。创建一个新的 Excel 表格或使用现有的表格。将提取的内容粘贴到表格中,每个 PDF 的内容放在一个垂直单元格中。保存表格文件。 所

三维激光扫描点云配准外业棋盘的布设与棋盘坐标测量

文章目录 一、棋盘标定板准备二、棋盘标定板布设三、棋盘标定板坐标测量 一、棋盘标定板准备 三维激光扫描棋盘是用来校准和校正激光扫描仪的重要工具,主要用于提高扫描精度。棋盘标定板通常具有以下特点: 高对比度图案:通常是黑白相间的棋盘格,便于识别。已知尺寸:每个格子的尺寸是已知的,可以用于计算比例和调整。平面标定:帮助校准相机和激光扫描仪之间的位置关系。 使用方法 扫描棋盘:

如何在Word中插入表格并进行高级格式化:冒号对齐、添加下划线并分栏

如何在Word中插入表格并进行高级格式化:详细教程 在Word中,表格是一个非常常用的工具,能够帮助我们更好地组织和展示信息。除此之外,本文还将深入探讨如何实现冒号对齐、添加专业的下划线以及隐藏表格线等高级技巧。通过这些技巧,能让你的文档更具美观性与专业性。 第一步:在Word页面上插入表格(大小为6行、2列) 插入表格 打开Word文档,将光标定位到想要插入表格的位置。点击菜单栏中的