2025 第一轮 A 百度之星题解

简要题目

有一棵 72 个节点的树。令\(w(u, v)\)表示树上两点之间的简单路径。称一个树上所有简单路径组成的集合的子集 S 是好的,当且仅当树上每条边\((u, v)\)都被恰好一条 S 中的路径覆盖。

对于一个好的集合 S,设\(f(S)\)表示对所有 1≤i≤n,结点 i 在 S 中作为某条路径端点的次数的最大值,即\(f(S)=\max _{i=1}^{n}(\sum_{w(u, v) \in S}[u=i \vee v=i])\)。需要统计有多少个好的集合 S 满足\(f(S)\)取到所有好的集合 T 中\(f(T)\)的最小值,答案对 998244353 取模。

注:

  • 一条路径是简单路径,当且仅当其不重复经过任何结点。树上任意两个结点之间有且仅有一条简单路径。

  • 树上所有简单路径组成的集合,可以看做对每个 1≤u≤v≤n 的节点对\((u, v)\),\(w(u, v)\)组成的集合。

  • 称边\((u, v)\)被简单路径\(s \leadsto t\)覆盖,当且仅当点 u,v 均在\(s \leadsto t\)的简单路径上。

分析过程

1. 找浅显性质:

  • 边经过恰好一次,点重复经过,但是这个性质好像没用,再找比较简单的、特殊的情况。

    • 链:显然就是 1,链接方法从头到尾。

    • 菊花图:发现对于奇数还是偶数好像有区别,就分开看。

    *   对于奇数个叶子,有一个叶子 -- 根,其余都是叶子 -- 叶子。

    *   对于偶数个都是叶子 -- 叶子,但 f 值都为 1。

*   再构造一个稍微一般一点的,发现 f 值都为 1,猜想 f 值始终为 1。

2. 证明 f 值始终为 1:

  • 证明每个点的最大成为端点数,就给点们分类证,显然分成做端点的点和不做端点的点。

    • \(f \ge 1\)由构造易证。

    • 反证法证明\(f \leq 1\):这里显然在考察贪心,所以用贪心的方法,设计决策,可以用转化法、决策包容性、范围缩放法,证明不等式,用反证法,证明\(f>1\)不成立。

      • 范围缩放法:不涉及范围,不可用。

      • 决策包容性:不知道怎么决策,不可用。

      • 转化法:可以用,如果一个点 u 是两条路径的端点,那么这两条路劲可以在 u 合二为一;如果一个点 u 是三条路径的端点,那么这三条路劲中的两条可以在 u 合二为一,所以 u 就是一个路径的端点。

      • u 是奇数个路径的端点,可以转化成 u 是一个路劲的端点;u 是偶数个路劲的端点,可以转化成 u 不做端点。

3. 计数:

  • 不是搜索就是递推就是推公式。

    • 但是这个题的证明 f==1 的过程带来的构造启示:先让每个边都是一个路径,在对作为端点数 1 的点进行合并,我们只需要看看每个点如何合并,因为每个点的合并方法是并列关系,所以只需分别对于每个点求出把这个点合并成只作为一个端点的方案数,再用乘法原理将他们相乘即可。

    • 看看每个点怎么合并:

      • 先看怎么合并和谁有关,显然只与当前点最为几次端点有关,联系上文,每个点最初作为(节点度数)个端点,且每个端点如何合并,不影响其他点。

      • 根据菊花图的分析,奇数度数和偶数度数不一样,分开分析:分析流程,将这个点与其连向的点组成菊花图,分析叶子 -- 叶子。

* 度数偶数:1 与其他 7 个点连,7 种;第二个点与剩下(8-2-1)=5 个点连,5 种,以此类推。方案数(opeven)\(opeven=(d[u]-1)!!\)。

度数奇数:最后剩下一个点与 u 相连,由于对称性,剩余哪个都一样,所以的系数是\(opodd = d[u]* opeven_{d'=d[u]-1}=d[u]*(d[u]-2)!!=d[u]!!\)。

代码实现

            1) #include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 10, M = 998244353;
// const int N = 15, M = 998244353;
int d[N];
int jie[N];
signed main()
{
jie[1] = 1;
for (int i = 3; i <= N - 2; i += 2)
jie[i] = (jie[i - 2] * i) % M;
int T;
cin >> T;
while (T--)
{
int n;
cin >> n;
memset(d, 0, sizeof d);
for (int i = 1; i < n; ++i)
{
int t1, t2;
cin >> t1 >> t2;
d[t1]++;
d[t2]++;
}
int ans = 1;
for (int i = 1; i <= n; ++i)
{
if (d[i] % 2)
ans = (ans * jie[d[i]]) % M;
else
ans = (ans * jie[d[i] - 1]) % M;
}
cout << ans << endl;
}
return 0;
}

2025百度之星第一轮T1:Bus Station题解的更多相关文章

  1. 2014百度之星第一题Energy Conversion

    Energy Conversion Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  2. hdu 6114 百度之星复赛B T1

    Chess Problem Description 車是中国象棋中的一种棋子,它能攻击同一行或同一列中没有其他棋子阻隔的棋子. 一天,小度在棋盘上摆起了许多車……他想知道,在一共N×M个点的矩形棋盘中 ...

  3. 2018百度之星B轮 degree

    degree Accepts: 1581 Submissions: 3494 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/1 ...

  4. HDU-6668-Game 百度之星第一场B

    在多个连续的区间段中,选出连续重复度最高的区间,这样连续选出多个重复度最高的不相交区间,然后从第一个区间的左边已经右边开始,连续贪心即可,答案取最小值 #include<iostream> ...

  5. 【百度之星2014~初赛(第二轮)解题报告】JZP Set

    声明 笔者近期意外的发现 笔者的个人站点http://tiankonguse.com/ 的非常多文章被其他站点转载,可是转载时未声明文章来源或參考自 http://tiankonguse.com/ 站 ...

  6. 百度之星B题(组合数)

    Problem B Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...

  7. 【百度之星2014~初赛(第二轮)解题报告】Chess

    声明 笔者近期意外的发现 笔者的个人站点http://tiankonguse.com/ 的非常多文章被其他站点转载.可是转载时未声明文章来源或參考自 http://tiankonguse.com/ 站 ...

  8. 百度之星A

    Scenic Popularity Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  9. 2014百度之星预赛(第二场)——Best Financing

    2014百度之星预赛(第二场)--Best Financing Problem Description 小A想通过合理投资银行理財产品达到收益最大化.已知小A在未来一段时间中的收入情况,描写叙述为两个 ...

  10. 百度之星2017初赛A-1005-今夕何夕

    今夕何夕 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

随机推荐

  1. C# Delegate 委托及事件

    1.委托Delegate实质 由一个修饰符+  delegate,跟方法的定义比较类似,也需要声明参数和返回值.声明一个委托,就是声明一种方法签名(参数+返回值),只要是和声明委托方法签名相同的方法, ...

  2. Python 潮流周刊#99:如何在生产环境中运行 Python?(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  3. C#/.NET/.NET Core技术前沿周刊 | 第 36 期(2025年4.21-4.27)

    前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...

  4. 遇到的问题之“list的addAll()报空指针异常”

    一.错误图 java.lang.NullPointerException at java.util.ArrayList.addAll(ArrayList.java:581) at com.bessky ...

  5. SQL 强化练习 (四)

    继续每日一练 sql 肯定会无敌强的后面. 恰好今天项目弄报表这块, 用了国产的 BI 工具, 帆软Report, 除了页面控件做得有些 low 外, 我感觉其他各方面都特别适合做 中国式的报表. 明 ...

  6. 2020年Android面试题含答案

    在去年年初的P2P大浪潮中,成了失业人员之一,于是各种准备面试,发现面试题网上很多,但是都是很凌乱的,而且一个地方一点,没有一个系统的面试题库,有题库有的没有答案或者是答案很简洁,没有达到面试的要求. ...

  7. Linux Shell整理小知识

    Linux Shell整理小知识 介绍两个命令 1. shopt shell option, 即shell的一些选项设置 [root@localhost ~]# shopt autocd off cd ...

  8. wireshark 抓包查看包得明文消息

    转载注明出处: 最近在进行一些网络消息得定位,发现可以用wireshark查看网络包得消息内容,特此记录 需要注意得是,需要将wireshark更新到最新得版本,如果是老版本有可能不支持. 使用tcp ...

  9. 信创-ORACLE迁移到DM8

    信创-ORACLE迁移到DM8 1. DM8实列初始化 安装可以直接参考官网安装说明(安装说明)[https://eco.dameng.com/document/dm/zh-cn/pm/install ...

  10. 电脑上多个git账户并且为不同仓库设置不同的用户名

    说明 生成多个公钥命令 我这里以Gitee和我公司内网Gitlab举例,打开git bash (右键,Git Bash Here) 首先生成Gitee的 依次执行以下命令 git config --g ...