当前位置: 首页 > news >正文

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

Description

Luogu4827
BZOJ2159

给定一棵树,对于每个点\(x\),求出\(\sum\limits_{i=1}^n dist(x, i)^k\)

Solution

\(x^k\)有关的题目,基本都要扯到第二类斯特林数上

啥是第二类斯特林数?第二类斯特林数\(\big\{^x_k\big\}\)表示将\(x\)个元素分成\(k\)个非空子集的方案数,\(\big\{^x_k\big\}=\big\{^{x-1}_{k-1}\big\}+k\big\{^{x-1}_k\big\}\)
这东西和\(x^k\)咋扯上的关系咧?\(x^k = \sum_{i=1}^k \big\{^k_i\big\} \cdot A_x^i\),思考这个式子的组合意义就好了。当然这个式子也可以变形成\(\sum_{i=1}^k \big\{^k_i\big\} \cdot i! {x\choose i}\)

然后变形一下原来的式子\(\sum\limits_{i=1}^n dist(x, i)^k = \sum\limits_{i=1}^n \sum_{j=1}^k \big\{^k_j\big\} \cdot j! {dist(x, i)\choose i}\),然后就是交换一下求和顺序,预处理前两项,树形DP最后一项即可。

Code

#include <cstdio>
#include <vector>

const int N = 5e4 + 10;
const int M = 2 * N;
const int MOD = 10007;

int n, K;
std::vector<int> g[N];
int fa[N];
int S[155][155]; // 斯特林数 
int fct[155]; // 阶乘
int u[N][155], d[N][155], ans[N]; 

void dfs1(int x, int fa) {
    d[x][0] = 1;
    for (int i : g[x]) if (i != fa) {
        dfs1(i, x);
        d[x][0] = (d[x][0] + d[i][0]) % MOD;
        for (int j = 1; j <= K; ++j) {
            d[x][j] = (d[x][j] + d[i][j-1] + d[i][j]) % MOD;
        }
    }
}

void dfs2(int x, int fa) {
    u[x][0] = n-d[x][0];
    if (fa) for (int i = 1; i <= K; ++i) {
        u[x][i] = 
            u[fa][i] + d[fa][i] - d[x][i] - d[x][i-1] + 
            u[fa][i-1] + d[fa][i-1] - d[x][i-1] - d[x][i-2]
            + 4 * MOD;
        u[x][i] %= MOD;
    }
    for (int i : g[x]) if (i != fa) dfs2(i, x);
}

int main() {
    scanf("%d%d", &n, &K);
    for (int i = 1, x, y; i < n; ++i) {
        scanf("%d%d", &x, &y);
        g[x].push_back(y);
        g[y].push_back(x);
    }
    S[1][1] = 1;
    for (int i = 2; i <= K; ++i) {
        for (int j = 1; j <= K; ++j) {
            S[i][j] = (S[i-1][j-1] + S[i-1][j]*j) % MOD;
        }
    }
    fct[1] = 1;
    for (int i = 2; i <= K; ++i) fct[i] = i * fct[i-1] % MOD;
    dfs1(1, 0);
    dfs2(1, 0);
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= K; ++j) {
            ans[i] = (ans[i] + S[K][j]*fct[j]%MOD * (u[i][j]+d[i][j])%MOD) % MOD;
        }
        printf("%d\n", ans[i]);
    }
    return 0;
}

转载于:https://www.cnblogs.com/wyxwyx/p/lg4827.html

相关文章:

  • 说说 C 语言编程利器 CLion
  • Netty系列文章之构建HTTP(HTTPS)应用程序
  • 配置Redis客户端
  • c# 读取blob数据
  • 一文详解达观数据知识图谱技术与应用——技术直播回顾
  • shell日志颜色处理
  • 关于矩阵自由度的解释
  • 使用包和测试
  • 2018 noip 考前临死挣扎
  • vue增加按钮到表头单元格的解决方法
  • PostgreSQL 10.1 手册_部分 IV. 客户端接口_第 33 章 libpq - C 库_33.19. 在线程化程序中的行为...
  • facl权限(getfacl/setfacl)
  • Python打包系统简单入门
  • 动画开发
  • 高性能架构-存储高性能-关系型数据库
  • HashMap ConcurrentHashMap
  • JS+CSS实现数字滚动
  • mongodb--安装和初步使用教程
  • Python语法速览与机器学习开发环境搭建
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 安卓应用性能调试和优化经验分享
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 闭包--闭包作用之保存(一)
  • 高程读书笔记 第六章 面向对象程序设计
  • 机器学习中为什么要做归一化normalization
  • 技术胖1-4季视频复习— (看视频笔记)
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • (06)金属布线——为半导体注入生命的连接
  • (solr系列:一)使用tomcat部署solr服务
  • (多级缓存)多级缓存
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • .cfg\.dat\.mak(持续补充)
  • .NET Core跨平台微服务学习资源
  • .NET DataGridView数据绑定说明
  • .net 中viewstate的原理和使用
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .Net中间语言BeforeFieldInit
  • [ABP实战开源项目]---ABP实时服务-通知系统.发布模式
  • [Android] 修改设备访问权限
  • [ASP.NET 控件实作 Day7] 设定工具箱的控件图标
  • [c#基础]值类型和引用类型的Equals,==的区别
  • [C/C++]数据结构----顺序表的实现(增删查改)
  • [C++] 多线程编程-thread::yield()-sleep_for()
  • [c++] 什么是平凡类型,标准布局类型,POD类型,聚合体
  • [C++]18:set和map的使用
  • [Geek Challenge 2023] web题解
  • [Gym-102091E] How Many Groups
  • [IE 技巧] 显示/隐藏IE 的菜单/工具栏
  • [JS]JavaScript 注释 输入输出语句
  • [LeetCode] Minimum Path Sum