Maximum Diameter

题目大意

定义长度为 \(n\) 的序列 \(a\) 的权值为:

  • 所有的 \(n\) 个点的第 \(i\) 个点的度数为 \(a_i\) 的树的直径最大值,如果不存在这样的树,其权值为 \(0\)。

给定 \(n\),求所有长度为 \(n\) 的序列的权值和。

思路分析

\(n\) 个点的树的边数为 \(n-1\),总度数为 \(2n-2\),故序列 \(a\) 的权值不为 \(0\) 当且仅当 \(\sum a=2n-2\) 且 \(a_i>0\),因此我们只需要考虑这样的序列即可。

考虑如何根据给定序列构造出直径最大的树,设 \(a\) 中有 \(k\) 个 \(1\),也就是树上有 \(k\) 个叶子节点,那么我们可以将剩下的 \(n-k\) 个节点全部串在一起,再在两端放上两个叶子节点,用 \(n-k+2\) 个点构造出一条长 \(n-k+1\) 的链,其余的叶子节点挂在链上,显然这是最优方案,直径为 \(n-k+1\)。

考虑计数。枚举 \(k\),那么叶子节点的选择方案数为 \({n \choose k}\)。而非叶子节点的度数必须大于 \(1\),且有 \(n-k\) 个,又因为剩余的可用度数为 \(2n-2-k\),所以这个问题等价于将 \(2n-2-k\) 个相同的球放在 \(n-k\) 个盒子里,且每个盒子的球必须大于 \(1\),由插板法易得其方案数为:

\[{(2n-2-k)-2(n-k)+(n-k)-1\choose (2n-2-k)-2(n-k)}={n-3\choose k-2}
\]

再算上直径产生的贡献,故我们所求式即:

\[\sum_{k=1}^n{n\choose k}{n-3\choose k-2}(n-k+1)
\]

这个式子可以 \(O(n)\) 计算,但这显然不够,我们需要继续化简。

我们有以下两个式子:

  • 吸收恒等式:\(k{n\choose k}=n{n-1\choose k-1}\)

  • 范德蒙德卷积:\(\sum\limits_{i=0}^k{n\choose i}{m\choose k-i}={n+m\choose k}\)

一式可以直接拆组合数简单证明,二式通过组合意义显然成立。

然后我们就可以通过以上两个式子对所求式进行化简了:

\[\begin{aligned}
\sum_{k=1}^n{n\choose k}{n-3\choose k-2}(n-k+1)&=
-\sum_{k=1}^n{n\choose k}{n-3\choose k-2}(k-2+1-n)\\&=
-\sum_{k=1}^n{n\choose k}{n-3\choose k-2}(k-2)+(n-1)\sum_{k=1}^n{n\choose k}{n-3\choose k-2}\\&=
(n-1)\sum_{k=1}^n{n\choose k}{n-3\choose k-2}-(n-3)\sum_{k=1}^n{n\choose k}{n-4\choose k-3}\\&=
(n-1)\sum_{k=1}^n{n\choose k}{n-3\choose n-k-1}-(n-3)\sum_{k=1}^n{n\choose k}{n-4\choose n-k-1}\\&=
(n-1){2n-3\choose n-1}-(n-3){2n-4\choose n-3}
\end{aligned}\]

化到这样就可以 \(O(1)\) 计算了,只需要 \(O(n)\) 预处理组合数就行了。

代码

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath> using namespace std;
const int N = 2002000, L = 2000000, mod = 998244353;
#define int long long int fac[N], inv[N];
int T, n; int q_pow(int a, int b){
int res = 1;
while (b) {
if (b & 1) res = (res * a) % mod;
a = (a * a) % mod;
b >>= 1;
}
return res;
} int C(int n, int m){
if(n < m || n < 0 || m < 0) return 0;
return fac[n] * (inv[m] * inv[n - m] % mod) % mod;
} signed main(){
fac[0] = 1;
for (int i = 1; i <= L; i ++) fac[i] = fac[i - 1] * i % mod;
inv[L] = q_pow(fac[L], mod - 2);
for (int i = L; i >= 1; i --) inv[i - 1] = inv[i] * i % mod;
scanf("%lld", &T);
while (T --) {
scanf("%lld", &n);
int res1 = (n - 1) * C(2 * n - 3, n - 1) % mod;
int res2 = (n - 3) * C(2 * n - 4, n - 3) % mod;
int ans = (res1 - res2 + mod) % mod;
cout << ans << '\n';
}
return 0;
}

Maximum Diameter 题解的更多相关文章

  1. Educational Codeforces Round 55 (Rated for Div. 2):D. Maximum Diameter Graph

    D. Maximum Diameter Graph 题目链接:https://codeforces.com/contest/1082/problem/D 题意: 给出n个点的最大入度数,要求添加边构成 ...

  2. Educational Codeforces Round 55 (Rated for Div. 2) D. Maximum Diameter Graph (构造图)

    D. Maximum Diameter Graph time limit per test2 seconds memory limit per test256 megabytes inputstand ...

  3. C#版 - Leetcode 414. Third Maximum Number题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...

  4. Codeforces 1082 D. Maximum Diameter Graph-树的直径-最长链-构造题 (Educational Codeforces Round 55 (Rated for Div. 2))

    D. Maximum Diameter Graph time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  5. [CF1082D]Maximum Diameter Graph

    题目描述 Description Graph constructive problems are back! This time the graph you are asked to build sh ...

  6. CF1082D:Maximum Diameter Graph (简单构造)

    Graph constructive problems are back! This time the graph you are asked to build should match the fo ...

  7. [LeetCode]Maximum Subarray题解

    Maximum Subarray: Find the contiguous subarray within an array (containing at least one number) whic ...

  8. CodeForces 1082 D Maximum Diameter Graph

    题目传送门 题意:现在有n个点,每个点的度数最大为di,现在要求你构成一棵树,求直径最长. 题解:把所有度数为2的点先扣出来,这些就是这颗树的主干,也就是最长的距离. 然后我们把度数为2的点连起来,之 ...

  9. D. Maximum Diameter Graph 贪心+图论+模拟

    题意:给出n个点的度数列 上限(实际点可以小于该度数列)问可以构造简单路最大长度是多少(n个点要连通 不能有平行边.重边) 思路:直接构造一条长链  先把度数为1的点 和度数大于1的点分开  先把度数 ...

  10. Codeforces 1082D Maximum Diameter Graph (贪心构造)

    <题目链接> 题目大意:给你一些点的最大度数,让你构造一张图,使得该图的直径最长,输出对应直径以及所有的边. 解题分析:一道比较暴力的构造题,首先,我们贪心的想,要使图的直径最长,肯定是尽 ...

随机推荐

  1. 图书商城项目练习②后端服务Node/Express/Sqlite

    本系列文章是为学习Vue的项目练习笔记,尽量详细记录一下一个完整项目的开发过程.面向初学者,本人也是初学者,搬砖技术还不成熟.项目在技术上前端为主,包含一些后端代码,从基础的数据库(Sqlite).到 ...

  2. Jupyter无法运行websocket错误

    Juputer无法连接 系websocket连接出问题,浏览器控制台报错 ws 连接异常 WebSocket connection to 'ws://localhost:8888/api/kernel ...

  3. Blazor资源大全,很棒的Blazor

    Blazor资源大全 一个收集了很棒的Blazor资源的集合. Blazor是一个使用C#/Razor和HTML在浏览器中运行的.NET Web框架. 欢迎贡献!请先查看贡献指南.感谢所有的贡献者,你 ...

  4. idea专业版和idea社区版整合Tomcat,并将war包部署

    目录 一.idea专业版部署 二.idea社区版部署 三.错误案例 开发过程中,由于需要运用云平台,所以从新配置开发环境,其它或多或少有些许问题,但解决起来较为轻松.而对于部署注册中心Eureka时, ...

  5. 基于Avalonia 11.0.0+ReactiveUI 的跨平台项目开发1-通用框架

    基于Avalonia 11.0.0+ReactiveUI 的跨平台项目开发1-通用框架 Avalonia简介: Avalonia是.NET的一个跨平台UI框架,提供了一个灵活的样式系统,支持广泛的操作 ...

  6. Blazor提取出Razor类库,没有css的class的智能提示

    最开始从stackoverflow上找到了答案,有两种办法,但都不太理想 后来自己找了新的办法,其实很简单,把要用的css复制到Razor类库的wwwroot文件夹中,默认是不会复制到引用Razor类 ...

  7. redis 中的 字符串

    String是redis 中的最基本的类型, 为二进制安全  ,意味着String可以表示各种类型  一个字符串value 最大为 521M set k1 v100 set k2 v200 get 命 ...

  8. go run 和 go build的区别

    go run:编译并运行程序,但不会产生exe文件,运行速度也相应较慢 go build : 会产生exe文件,运行速度快

  9. 洛谷 P1336 最佳课题选择 题解

    P1336 最佳课题选择 题解 状态:考虑\(f_{i,j}\)表示前\(i\)种论文里面,一共写了\(j\)篇,的最少花费时间. 转移策略:我们一次考虑每一种论文写多少篇.假设写\(k\)篇,\(k ...

  10. nginx搭建静态文件下载服务器

    配置文件大致内容 server { # 监听8001端口 listen 8001; server_name 192.168.0.2; # 指定使用utf8的编码 charset utf-8; # 内容 ...