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. 什么是hive的高级分组聚合,它的用法和注意事项以及性能分析

    hive的高级分组聚合是指在聚合时使用GROUPING SETS.CUBE和ROLLUP的分组聚合. 高级分组聚合在很多数据库类SQL中都有出现,并非hive独有,这里只说明hive中的情况. 使用高 ...

  2. 即构✖叮咚课堂:行业第一套AI课堂解决方案是怎么被实现的?

    AI走进教育,是传统教育的一次迭代进化 在教育问题上,我们看到两类话题最容易引发公众讨论:教育公平和个性化教育,"互联网+教育"有可能解决第一类话题,"AI教育" ...

  3. LeetCode 周赛上分之旅 #33 摩尔投票派上用场

    ️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 [BaguTree Pro] 知识星球提问. 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思 ...

  4. Java 调用gdal API(二)——栅格裁剪

    gdal可以说是GIS数据处理比较好的工具之一,虽然也提供了Java API,但是官方文档确实太过简单,用起来确实太难受,每次都需要去参考对应的C++api,然后在对应使用. 因此小编决定从这篇文章开 ...

  5. node: #!/usr/bin/env node

    声明 windows中不支持Shebang,它是通过文件的扩展名来确定使用什么解释器来执行脚本 参考链接: https://juejin.cn/post/6844903826344902670

  6. PyQt5清除数据(部分控件)

    # 清除文本框 self.textEdit_detail.clear() # 清楚表格所有行 self.tableWidget.setRowCount(0) self.tableWidget.clea ...

  7. 处理css/js兼容性的工具之超重要的browserslist

    这篇 webpack处理css资源 文章中使用到的工具 browserslist 对于兼容性处理来说非常重要!这一篇来仔细说说. 查询兼容性 不同浏览器对于 css / js 的属性可能存在兼容性,具 ...

  8. [nginx]借助nginx实现自动获取本机IP

    前言 在用脚本自动化部署应用时,有的应用需要指定本机IP,网上找到的方案大多是过滤ifconfig或者ip命令的结果,这里提供一种通过nginx获取本机ip的方法.大致思路为客户端向nginx发起请求 ...

  9. [selenium]相对定位器

    前言 Relative Locators,相对定位器,是Selenium 4引入的一个新的定位器,相对定位器根据源点元素去定位相对位置的其它元素. 相对定位方法其实是基于JavaScript的 get ...

  10. dimp V8:[WARNING]login fail, check your username and password, and check the server status

    在进行某个项目的性能测试时,我们选择了达梦8作为使用的数据库.因前期的网络安全问题和考虑到节省成本,我们首先在公司本地服务器上搭建了相应的环境,并生成了用于压力测试的业务数据. 然而,在将数据库迁移到 ...