最短路径(虚树+期望)

problem

给定一棵 nnn 个结点的无根树,每条边的边权均为 111

树上标记有 mmm 个互不相同的关键点,小 A 会在这 mmm 个点中等概率随机地选择 kkk 个不同的点放上小饼干。

你想知道,经过有小饼干的 kkk 个点的最短路径长度的期望是多少。

注意,你可以任意选取起点和终点,路径也可以经过重复的点或重复的边。

答案对 998244353998244353998244353 取模。

solution

observation :起点和终点一定是有小饼干的特殊点。

因为要到达所有有小饼干的点,所以所有边都会走两次,除了起终点之间的路径只会走一次。

对这棵树建立虚树【只是在思想时体现,并不会在代码里体现】。

那么最短路径过程就是 dfs 虚树的过程,则可以表示为相邻两个小饼干点之间的路径之和的两倍➖一条路径的长度。

由于最短路径,可变的只有“一条路径的长度”选取,所以肯定是选最长的直径。

紧接着,发现这两个部分是独立的,可以分开计算。

  • 考虑一条在怎么的小饼干选取条件下会被纳入最短路径内计算。

    在这里插入图片描述

    显然,一条边将树划分成两个部分,当且仅当左右两个部分都有小饼干时才会计算到这条边的贡献。

    考虑左右两边都有小饼干的情况数。

    设左边部分大小为 xxx,则右边部分大小为 n−xn-xnx【大小指的是点数】。

    数量为 (mk)−(xk)−(n−xk)\binom{m}{k}-\binom{x}{k}-\binom{n-x}{k}(km)(kx)(knx)【所有情况数减去全都在左边或全都在右边的不合法数】。

  • 考虑一条路径【路径的两端 u,vu,vu,v 一定是特殊的小饼干点】在怎样的小饼干选取条件下会被当成直径。

    显然,充要条件是:所有的小饼干点两两之间的距离不超过该路径长度。

    由于直径的性质【不断扩点更新直径的做法】只需要判断其余小饼干点到 u,vu,vu,v 的距离都不超过考虑路径的长度。

    但是,很有可能有些小饼干分配方案,直径不是唯一的。

    这样就会因为“不超过”而被算重。

    所以需要对相同长度的直径指定一个规则,使之变为严格小于。

    这里选择最简单的一种:按照端点的编号排大小。

    注意:端点编号大小是第二关键字,使用这种方法排序的前提是第一关键字长度的大小相等。

    这样就会归纳出,这条路径是唯一的直径,当且仅当以下所有条件都不满足

    • dis(u,v)<dis(u,i)dis(u,v)<dis(u,i)dis(u,v)<dis(u,i)
    • dis(u,v)<dis(v,i)dis(u,v)<dis(v,i)dis(u,v)<dis(v,i)
    • dis(u,v)=dis(u,i)∧i<vdis(u,v)=dis(u,i)\wedge i<vdis(u,v)=dis(u,i)i<v
    • dis(u,v)=dis(v,i)∧i<udis(u,v)=dis(v,i)\wedge i<udis(u,v)=dis(v,i)i<u

枚举 iii 算出满足以上条件任何之一的 iii 的数量 cntcntcnt,最后就是计算剩下的 k−2k-2k2 个小饼干落到除去这些不合法点的情况数,即 (m−2−cntk−2)\binom{m-2-cnt}{k-2}(k2m2cnt)

最后所有贡献和除以总方案数 (mk)\binom{m}{k}(km) 就是期望了。

时间复杂度 O(m3)O(m^3)O(m3)

code

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mod 998244353
#define maxn 2005
vector < int > G[maxn];
int c[maxn][maxn], dis[maxn][maxn], f[maxn][15];
int siz[maxn], a[maxn], dep[maxn];
int n, m, k, ans;void init() {for( int i = 0;i <= m;i ++ ) {c[i][0] = c[i][i] = 1;for( int j = 1;j < i;j ++ )c[i][j] = ( c[i - 1][j - 1] + c[i - 1][j] ) % mod;}
}void dfs( int u, int fa ) {f[u][0] = fa, dep[u] = dep[fa] + 1;for( int i = 1;i < 15;i ++ ) f[u][i] = f[f[u][i - 1]][i - 1];for( int v : G[u] ) if( v ^ fa ) {dfs( v, u );ans = ( ans + c[m][k] - c[siz[v]][k] - c[m - siz[v]][k] ) % mod;siz[u] += siz[v];}
}int lca( int u, int v ) {if( dep[u] < dep[v] ) swap( u, v );for( int i = 14;~ i;i -- ) if( dep[f[u][i]] >= dep[v] ) u = f[u][i];if( u == v ) return u;for( int i = 14;~ i;i -- ) if( f[u][i] ^ f[v][i] ) u = f[u][i], v = f[v][i];return f[u][0];
}int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans;
}signed main() {freopen( "tree.in", "r", stdin );freopen( "tree.out", "w", stdout );scanf( "%lld %lld %lld", &n, &m, &k );init(); for( int i = 1;i <= m;i ++ ) scanf( "%lld", &a[i] ), siz[a[i]] = 1;for( int i = 1, u, v;i < n;i ++ ) {scanf( "%lld %lld", &u, &v );G[u].push_back( v );G[v].push_back( u );}dfs( 1, 0 );ans = ans << 1; //一条边要走两次for( int i = 1;i <= m;i ++ )for( int j = i + 1;j <= m;j ++ )dis[i][j] = dis[j][i] = dep[a[i]] + dep[a[j]] - ( dep[lca( a[i], a[j] )] << 1 );for( int u = 1;u <= m;u ++ )for( int v = u + 1;v <= m;v ++ ) {int cnt = 0;for( int i = 1;i <= m;i ++ )if( i ^ u and i ^ v )cnt += dis[u][v] < max( dis[u][i], dis[v][i] ) or ( dis[u][v] == dis[i][v] and i < u ) or ( dis[u][v] == dis[i][u] and i < v );ans = ( ans - dis[u][v] * c[m - 2 - cnt][k - 2] ) % mod;}printf( "%lld\n", ( ans * qkpow( c[m][k], mod - 2 ) % mod + mod ) % mod );return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316809.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AT2000 [AGC002F] Leftmost Ball(dp、组合数学)

解析 如果之前有些卡住的题可以说是奇淫技巧的话&#xff0c;这道题的思路只能说太经典了。 感觉其实也就是紫的难度吧&#xff0c;没做出来有些可惜。 还是有写畏黑情绪&#xff0c;见到黑题本能的感觉做不出来。 首先是一个比较自然的题意转化&#xff1a;有 k-1 个 1-n 的…

CF 1529E. Trees of Tranquillity

CF 1529E. Trees of Tranquillity 文章目录题意&#xff1a;题解&#xff1a;代码&#xff1a;线段树代码&#xff1a;利用set实现题意&#xff1a; 有A1&#xff0c;A2两棵树&#xff0c;根是1&#xff0c;编号都是1~n&#xff0c;先制作图A3&#xff0c;如果两个点的x和y同时…

【学习笔记】最大权闭合子图和最大密度子图(最小割的模型应用)

最大权闭合子图和最大密度子图最大权闭合子图contentexercise最大密度子图contentexerciseUpd&#xff1a;最大权闭合子图易懂证明最大权闭合子图 content 先作出以下声明&#xff1a; c(u,v):c(u,v):c(u,v): 边 (u,v)(u,v)(u,v) 的容量。 f(u,v):f(u,v):f(u,v): 边 (u,v)(u,…

Docker最全教程之使用Docker搭建Java开发环境(十八)

前言Java是一门面向对象的优秀编程语言&#xff0c;市场占有率极高&#xff0c;但是在容器化实践过程中&#xff0c;发现官方支持并不友好&#xff0c;同时与其他编程语言的基础镜像相比&#xff08;具体见各语言镜像比较&#xff09;&#xff0c;确实是非常臃肿。本篇仅作探索…

AT2705 [AGC019F] Yes or No(组合数学)

解析 Atcoder的题超小的码量总让人做不出来的时候感到很不甘心… 但这题确实挺难的&#xff0c;主要还是魔术一样的奇淫技巧。 大力推式子那个阴间方法我直接选择弃疗。 一个很显然的结论是&#xff1a;肯定回答当前剩的比较多的选项。 pia一张洛谷的图&#xff1a; &#…

Coding Contest HDU - 5988

Coding Contest HDU - 5988 题意&#xff1a; 有n个点&#xff0c;m个边&#xff0c;每个点有人数和食物数&#xff0c;每个人都要吃一份食物&#xff0c;如果该点的食物不够&#xff0c;他们就要去其他点&#xff0c;每个边最多只能走c次&#xff0c;每次有人走一条路&#…

ASP.NET Core 项目简单实现身份验证及鉴权

环境VS 2017ASP.NET Core 2.2目标以相对简单优雅的方式实现用户身份验证和鉴权&#xff0c;解决以下两个问题&#xff1a;无状态的身份验证服务&#xff0c;使用请求头附加访问令牌&#xff0c;几乎适用于手机、网页、桌面应用等所有客户端基于功能点的权限访问控制&#xff0c…

AT4352 [ARC101C] Ribbons on Tree

解析 其实想到了断边按连通块容斥的做法。 但不知道为啥觉得没前途弃了… 悲。 考虑容斥&#xff0c;设 f[x][i] 表示 x 子树内与 x 所连的联通块有 i 个节点的方案数&#xff0c;第三维朴素是记录连通块个数&#xff0c;但其实只需要记一个 0/1 表示奇偶性即可。 然后题解奥…

【无码专区7】括号序列(思维)

因为只有std&#xff0c;没有自我实现&#xff0c;所以是无码专区 主要是为了训练思维能力 solution才是dls正解&#xff0c;但是因为只有潦草几句&#xff0c;所以大部分会有我自己基于正解上面的算法实现过程&#xff0c;可能选择的算法跟std中dls的实现不太一样。 std可能…

2016ICPC青岛

2016ICPC青岛 题号题目难度知识点ARelic Discovery签到贪心BPocket Cube快铜大模拟CPocky签到数论&#xff0c;推公式DLucky CoinsEFibonacciFLambda CalculusGCoding Contest银牌题网络流HPatternITravel BrochureJCliquesKFinding HotelsLTower AttackMGenerator and Monito…

ML.NET 发布0.11版本:.NET中的机器学习,为TensorFlow和ONNX添加了新功能

微软发布了其最新版本的机器学习框架&#xff1a;ML.NET 0.11带来了新功能和突破性变化。新版本的机器学习开源框架为TensorFlow和ONNX添加了新功能&#xff0c;但也包括一些重大变化, 这也是发布RC版本之前的最后一个预览版&#xff0c;这个月底将发布0.12版本&#xff0c;也就…

CF1267G Game Relics(期望、背包)

解析 有些遗憾的一个题。 几乎已经做出来了&#xff0c;但最后把买的代价看成平均数确实没有想到。 还有那个背包我觉得直接做会炸精度&#xff0c;就开始各种玩泥巴。 悲。 比较显然的结论是最优解必然是先抽抽抽然后再买买买。 剩 i 个宝物的时候抽出一个新宝物的期望代价比…

铺地毯(矩形的交+前后缀矩形交)

铺地毯problemsolutioncodeproblem 给定矩阵的长宽 P,QP,QP,Q&#xff0c;矩阵从下往上从左往后编号增加&#xff0c;(0,0)∼(P,Q)(0,0)\sim (P,Q)(0,0)∼(P,Q)。 给定 nnn 张长宽平行于坐标轴的矩形地毯&#xff0c;左下角和右上角的坐标。 求被至少 n−1n-1n−1 张地毯覆盖…

AT2366 [AGC012F] Prefix Median(dp)

解析 确实精妙的一道题。 卡在最后一步dp转化上了&#xff0c;这个转化也确实是本题的难点。 当一个计数难以下手的时候&#xff0c;先想想如何判合法&#xff1f; 不难想到一个较为显然的贪心&#xff1a;假如和上一个一样&#xff0c;就填一个当前的最大值和最小值&#xf…

2020CCPC长春

2020CCPC长春 题号题目难度知识点AKrypton签到01背包BThe Tortoise and the HareCQuantum GeometryDMeaningless Sequence签到推公式EDefense of Valor LeagueFStrange Memory树上启发式合并GMonkey’s KeyboardHCombination LockIKawaii CourierJAbstract PaintingKRagdollLC…

如何使用AWS和Azure的配置存储服务保存读取配置

原文&#xff1a;Want to yank configuration values from your .NET Core apps? 作者&#xff1a;pauljwheeler译文&#xff1a;https://www.cnblogs.com/lwqlun/p/10508748.html译者&#xff1a;Lamond Lu示例源代码&#xff1a;https://github.com/lamondlu/LoadConfigurat…

基站建设(三元环计数+根号分治 / bitset)

基站建设problemsolutioncodeproblem 给定 nnn 个地点&#xff0c;以及每个地点的可靠度 RiR_iRi​。 有 mmm 条光纤架&#xff0c;每一条连接两个不同的地点&#xff0c;且是双向的。 测试基站由 444 个信号塔&#xff0c;有 222 个主信号塔和 222 个副信号塔。 要求主信号…

CF1060F Shrinking Tree(期望、树形dp)

解析 神题。 把每个节点提到根 rt 单独考虑。 设 dpi,jdp_{i,j}dpi,j​ 表示当 rt 进入 i 时子树内还有 j 条边未合并的方案的期望之和&#xff0c;gi,jg_{i,j}gi,j​ 表示当 rt 进入 i 的父亲时 i 的子树内&#xff08;包括连向父亲的边&#xff09;还有 j 条边未合并的方案…

Meaningless Sequence Gym - 102832D

Meaningless Sequence Gym - 102832D 题意&#xff1a; 给你n和c&#xff0c;an的公式如下图 让你求a0…an的和&#xff0c;mod 1e97 题解&#xff1a; 训练时推了好一阵子才和队友推出 我看网上正解为&#xff1a; 一个数的大小与它的二进制表示中的1的个数有关 ac(二进制…

【.NET Core项目实战-统一认证平台】第十六章 网关篇-Ocelot集成RPC服务

一、什么是RPCRPC是“远程调用&#xff08;Remote Procedure Call&#xff09;”的一个名称的缩写&#xff0c;并不是任何规范化的协议&#xff0c;也不是大众都认知的协议标准&#xff0c;我们更多时候使用时都是创建的自定义化&#xff08;例如Socket&#xff0c;Netty&#…