2020百度之星初赛第三场 Ant(概率)

2024-04-16 00:32

本文主要是介绍2020百度之星初赛第三场 Ant(概率),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Problem Description
有一棵 n 个节点的石榴树,点的下标为 1…n,下标为 m 的节点上有一颗石榴。石榴树有 2n−2 条有向边,每条有向边都连接两个不同的节点,不存在完全相同的两条有向边,且如果从节点 a 到节点 b 的有向边存在,反过来从节点 b 到节点 a 的有向边也必定存在。从任意一个节点都能(经过这些有向边中的若干条)到达任意一个其它节点。

现在有两只小蚂蚁去找石榴。

两只小蚂蚁都从 1 号点出发,第一只蚂蚁先走。它每次会从它当前所在的节点出发的没有走过的有向边中等概率地选择一条走(注意从 a 到 b 和从 b 到 a 是两条不同的有向边),并且在这条有向边上留下信息素。如果蚂蚁找到了石榴,或者无路可走了,它就会停下来。

第一只蚂蚁停下来以后第二只蚂蚁走,它每次从它当前所在的节点出发的有第一只蚂蚁留下的信息素且自己没走过的有向边中等概率地选择一条走。如果第二只蚂蚁找到了石榴,或者它无路可走了,它就会停下来。

如果第二只蚂蚁沿着从 1 到 m 的最短路找到了石榴,就说它成功了。请问对于第一只蚂蚁,使得第二只蚂蚁成功率大于等于 1/2 的概率是多少?

Input
第一行一个正整数 test (1≤test≤100) 表示数据组数。

对于每组数据,第一行两个正整数 n,m (1≤n≤100000,1≤m≤n) 分别表示点数和石榴在哪里。

接下来 n−1 行描述 2n−2 条有向边,每行两个整数 x,y 代表从 x 到 y 和从 y 到 x 各有一条有向边。

数据保证读入是一棵合法的石榴树,数据保证树是这样随机生成的:

for (int i = 1; i <= n; i++)
a[i] = i;
random_shuffle(a + 1, a + n + 1);
for (int i = 2; i <= n; i++)
连接编号为 a[i] 和 a[j] 的点,其中 j 为 {1, ..., i-1} 中一个随机的整数。每次随机相互独立。

(实际上每次随机使用了C++自带的随机函数。)

Output
对于每组数据,一行一个数表示答案。由于答案 A/B 中的 AB 可能很大,请输出 A/Bmod(109+7)。假设 A/B 为最简分数,A/Bmod(109+7)=A×B−1mod(109+7),B−1 为满足 B−1×Bmod(109+7)=1 的整数。

Sample Input
3
1 1
4 2
1 2
1 3
1 4
5 4
1 2
1 3
3 4
3 5

Sample Output
1
666666672
416666670

Source
2020 年百度之星·程序设计大赛 - 初赛三

思路:
因为第二只蚂蚁只会根据第一只蚂蚁留下信息素的路径走,所以只需要考虑第一只蚂蚁是否走到石榴即可。

走到石榴分为两种情况,一种是直接走到,这个路径是唯一的;另一种是“拐弯”再走到。

  1. 直接走到,那就直接递归的走,就是 f 1 [ x ] = f 1 [ v ] s i z e [ x ] f1[x]=\frac{f1[v]}{size[x]} f1[x]=size[x]f1[v] s i z e [ x ] size[x] size[x]代表 x x x相连节点个数。
  2. 拐弯再走到,首先考虑子节点中的拐弯,就是 f 2 [ x ] = f 2 [ v ] s i z e [ x ] f2[x]=\frac{f2[v]}{size[x]} f2[x]=size[x]f2[v],这与上面相同。
  3. 再考虑当前节点的拐弯。既然是拐弯,那就肯定不能走指向石榴的那个节点,所以可供选择的节点个数是 s i z e [ x ] − 1 size[x]-1 size[x]1。只要不走到 x x x指向父节点的路径,那就一定能走回到 x x x(这不难想象,走到某个子树,无论怎么走,最后都会返祖,走向指向父节点的路径),所以有效的节点个数是 s i z e [ x ] − 1 − ( x ! = 1 ) size[x]-1-(x!=1) size[x]1(x!=1)。那么有 f 2 [ x ] + = f 1 [ x ] ∗ s i z e [ x ] − 1 − ( x ! = 1 ) s i z e [ x ] − 1 f2[x]+=f1[x]*\frac{size[x]-1-(x!=1)}{size[x]-1} f2[x]+=f1[x]size[x]1size[x]1(x!=1)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>using namespace std;typedef long long ll;
const int maxn = 1e5 + 7;
const int mod = 1e9 + 7;vector<int>G[maxn];
ll f1[maxn],f2[maxn];ll qpow(ll x,ll n) {ll res = 1;while(n) {if(n & 1) {res = res * x % mod;}n >>= 1;x = x * x % mod;}return res;
}void dfs(int x,int fa,int m) {if(x == m) {f1[x] = 1;return;}for(int i = 0;i < G[x].size();i++) {int v = G[x][i];if(v == fa) continue;dfs(v,x,m);int tmp = (x != 1);if(f1[v]) {f1[x] = f1[v] * qpow((ll)G[x].size(),mod - 2) % mod;//从x出发直接走到石榴的概率f2[x] = f2[v] * qpow((ll)G[x].size(),mod - 2) % mod; //从x出发走到石榴且在子树中发生拐弯的概率f2[x] = (f2[x] + f1[x] * qpow((ll)G[x].size() - 1,mod - 2) % mod * (ll)(G[x].size() - 1 - tmp) % mod) % mod; //从x出发走到石榴且在x也发送了拐弯的概率}}
}int main() {int T;scanf("%d",&T);while(T--) {int n,m;scanf("%d%d",&n,&m);for(int i = 1;i <= n;i++) {G[i].clear();f1[i] = f2[i] = 0;}for(int i = 1;i < n;i++) {int x,y;scanf("%d%d",&x,&y);G[x].push_back(y);G[y].push_back(x);}dfs(1,-1,m);printf("%lld\n",(f1[1] + f2[1]) % mod);}return 0;
}

这篇关于2020百度之星初赛第三场 Ant(概率)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/907343

相关文章

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

hdu4865(概率DP)

题意:已知前一天和今天的天气概率,某天的天气概率和叶子的潮湿程度的概率,n天叶子的湿度,求n天最有可能的天气情况。 思路:概率DP,dp[i][j]表示第i天天气为j的概率,状态转移如下:dp[i][j] = max(dp[i][j, dp[i-1][k]*table2[k][j]*table1[j][col] )  代码如下: #include <stdio.h>#include

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

Imageview在百度地图中实现点击事件

1.首先第一步,需要声明的全局有关类的引用 private BMapManager mBMapMan; private MapView mMapView; private MapController mMapController; private RadioGroup radiogroup; private RadioButton normalview; private RadioBu

Axure元件库Ant Design中后台原型模板:提升设计与开发效率的利器

企业对于中后台产品的设计与开发需求日益增长。为了提升用户体验和开发效率,设计者和开发者们不断寻求更加高效、统一的解决方案。Ant Design,作为阿里巴巴开源的一套企业级UI设计语言和React组件库,凭借其丰富的组件和统一的设计风格,已成为众多项目的首选。而在Axure中使用Ant Design元件库,更是为中后台产品的原型设计带来了极大的便利。 Ant Design简介 Ant D

概率DP (由一道绿题引起的若干问题。目前为一些老题,蒟蒻的尝试学习1.0)

概率DP: 利用动态规划去解决 概率 期望 的题目。 概率DP 求概率(采用顺推) 从 初始状态推向结果,同一般的DP类似,只是经历了概率论知识的包装。 老题: 添加链接描述 题意: 袋子里有w只白鼠,b只黑鼠,A和B轮流从袋子里抓,谁先抓到白色谁就赢。A每次随机抓一只,B每次随机 抓完一只后 会有另外一只随机老鼠跑出来。如果两个人都没有抓到白色,那么B赢。A先抓,问A赢得概率。 w b 均在

2024国赛论文拿奖快对照这几点及评阅要点,勿踩雷区!(国赛最后冲刺,提高获奖概率)

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 2024“高教社杯”全国大学生数学建模竞赛已过去第三个夜晚,小伙伴们都累了没有,如果感到思维滞涩,别忘了稍作休息,放松一下自己,准备迎接国赛非常重要的收尾阶段——论文。 国赛这几天的努力最后都

CPC23第三场、第四场总结

这两天跟着Arthur学长们混了两天现场赛,有种打怪升级的感觉,就是90级的老大们带30级的我去打100级的BOSS,看着Arthur他们在不断的输出,我在一旁水经验·······不过我也没闲着玩泥巴,在status里留下了一大片WA、TLE、RE··········         CPC23第三场,开场19分钟,Arthur全场一A了C题,于是我就开始跟着切C题。看了一眼题目

百度之星 2015 复赛 1001 (数长方形)

数长方形    Accepts: 595    Submissions: 1225  Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description 小度熊喜欢玩木棒。一天他在玩木棒的时候,发现一些木棒会形成长方形

百度之星 2015 初赛(1) 1002 找连续数

找连续数      Accepts: 401      Submissions: 1911  Time Limit: 2000/1000 MS (Java/Others)      Memory Limit: 32768/32768 K (Java/Others) Problem Description 小度熊拿到了一个无序的数组,对于这个数组,小度熊想知道是