【题目】F. Strongly Connected Tournament

【题意】给定n个点(游戏者),每轮游戏进行下列操作:

1.每对游戏者i和j(i<j)进行一场游戏,有p的概率i赢j(反之j赢i),连边从赢者向输者,从而得到一个有向完全图。

2.对于其中点数>1的强连通分量再次进行过程1,直至不存在点数>1的强连通分量为止。

给定n和p,求游戏总场次的期望。2<=n<=2000。

【算法】数学概率,期望DP

【题解】答案只和点数有关,设ans(n)表示n个点游戏总场次的期望,ans(0)=ans(1)=0。对于有向完全图,一定有且仅有一个出度为0的强连通分量,据此转移。(入度为0也行)

$$ans(n)=\sum_{i=1}^{n}s(i)*cp(n,i)*[ans(i)+ans(n-i)+i*(n-i)+\frac{i*(i-1)}{2}]$$

第一部分:首先选择i个点形成强连通分离,设s(i)表示i个点形成强连通分量的概率。

第二部分:然后这i个点必须是出度为0的强连通分量(拓扑序最后一个),换句话说必须被所有其它n-i个点打败。设cp(n,i)表示n个点中选i个点满足被其它n-i个点打败的概率。

第三部分:假设确定了最后一个强连通分量是i个点,那么这i个点进行了一轮游戏i*(i-1)/2,然后这i个点进入下一轮ans(i),其它n-i个点视为正常继续游戏ans(n-i),本轮游戏相互之间还有n*(n-i)场。

移项解方程。(cp(n,n)=1)

接下来计算cp(n,i)表示n个点中选i个点满足被其它n-i个点打败的概率,显然cp(n,0)=1。打败的概率和编号密切相关,所以通过依赖于点n的归属来计算:

$$cp(n,i)=p^{n-i}*cp(n-1,i)+(1-p)^i*cp(n-1,i-1)$$

第n个点要么是集合中的点,要么是集合外的点。

接下来计算s(n)表示n个点形成强连通分量的概率,显然s(1)=1。直接考虑形成强连通分量相当困难,换一种方式,按主方程一样考虑拓扑序最后一个强连通分量(如果大小不是n说明不是强连通分量)。

$$s(n)=1-\sum_{i=1}^{n-1}s(i)*cp(n,i)$$

复杂度O(n^2)。

#include<cstdio>
#include<algorithm>
using namespace std;
const int MOD=,maxn=;
int n,a,b,p,q,pp[maxn],qq[maxn],cp[maxn][maxn],strong[maxn],ans[maxn];
int M(int x){return x>=MOD?x-MOD:x;}
int power(int x,int k){
int ans=;
while(k){
if(k&)ans=1ll*ans*x%MOD;
x=1ll*x*x%MOD;
k>>=;
}
return ans;
}
int main(){
scanf("%d%d%d",&n,&a,&b);
p=1ll*a*power(b,MOD-)%MOD;
q=M(-p+MOD);
pp[]=qq[]=;
for(int i=;i<=n;i++)pp[i]=1ll*pp[i-]*p%MOD,qq[i]=1ll*qq[i-]*q%MOD;
cp[][]=;
for(int s=;s<=n;s++){
cp[s][]=;
for(int i=;i<=s;i++)cp[s][i]=M(1ll*cp[s-][i]*qq[i]%MOD+1ll*cp[s-][i-]*pp[s-i]%MOD);
}
strong[]=;
for(int s=;s<=n;s++){
for(int i=;i<s;i++)strong[s]=M(strong[s]+1ll*strong[i]*cp[s][i]%MOD);
strong[s]=M(-strong[s]+MOD);
}
ans[]=ans[]=;
for(int s=;s<=n;s++){
ans[s]=;
for(int i=;i<s;i++){
a=1ll*strong[i]*cp[s][i]%MOD;
b=(i*(s-i)+i*(i-)/+ans[i]+ans[s-i])%MOD;
ans[s]=M(ans[s]+1ll*a*b%MOD);
}
ans[s]=1ll*M(ans[s]+1ll*strong[s]*s*(s-)/%MOD)*power(M(-strong[s]+MOD),MOD-)%MOD;
}
printf("%d",ans[n]);
return ;
}

【CodeForces】913 F. Strongly Connected Tournament 概率和期望DP的更多相关文章

  1. 【CF913F】Strongly Connected Tournament 概率神题

    [CF913F]Strongly Connected Tournament 题意:有n个人进行如下锦标赛: 1.所有人都和所有其他的人进行一场比赛,其中标号为i的人打赢标号为j的人(i<j)的概 ...

  2. 【算法学习笔记】概率与期望DP

    本文学习自 Sengxian 学长的博客 之前也在CF上写了一些概率DP的题并做过总结 建议阅读完本文再去接着阅读这篇文章:Here 前言 单纯只用到概率的题并不是很多,从现有的 OI/ACM 比赛中 ...

  3. 【BZOJ-4008】亚瑟王 概率与期望 + DP

    4008: [HNOI2015]亚瑟王 Time Limit: 20 Sec  Memory Limit: 512 MBSec  Special JudgeSubmit: 832  Solved: 5 ...

  4. 概率和期望dp

    概率和期望dp 概率和期望好神啊,完全不会. 网上说概率要顺着推,期望要逆着推,然而我目前做的概率期望题正好都与此相反2333   概率: 关于概率:他非常健康 初中概率题非常恐怖.现在来思考一道题: ...

  5. 概率与期望dp相关

    概率与期望dp 概率 某个事件A发生的可能性的大小,称之为事件A的概率,记作P(A). 假设某事的所有可能结果有n种,每种结果都是等概率,事件A涵盖其中的m种,那么P(A)=m/n. 例如投掷一枚骰子 ...

  6. @codeforces - 913F@ Strongly Connected Tournament

    目录 @description@ @solution@ @accepted code@ @details@ @description@ n 个选手参加了一场竞赛,这场竞赛的规则如下: 1.一开始,所有 ...

  7. 概率及期望DP小结

    资源分享 26 个比较概率大小的问题 数论小白都能看懂的数学期望讲解 概念 \(PS\):不需要知道太多概念,能拿来用就行了. 定义 样本(\(\omega\)):一次随机试验产生的一个结果. 样本空 ...

  8. 【BZOJ-3450】Tyvj1952Easy 概率与期望DP

    3450: Tyvj1952 Easy Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 468  Solved: 353[Submit][Status] ...

  9. BZOJ 3566 [SHOI2014]概率充电器 ——期望DP

    期望DP. 补集转化,考虑不能被点亮的情况, 然后就是三种情况,自己不能亮,父亲不能点亮它,儿子不能点亮它. 第一次计算比较容易,第二次计算的时候需要出去第一次的影响,因为一条线只能传导一次 #inc ...

随机推荐

  1. 使用Python 、 go 语言测试rabbitmq的工作机制

    1:在haproxy 和 rabbitmq上安装Python.python2-pip,默认是Python2 yum install -y python python2-pip   2:在haproxy ...

  2. WebService(三)

    JAX-WS简单使用示例: 1.服务端 package com.rong.service; import javax.jws.WebMethod; import javax.jws.WebParam; ...

  3. 5th 各组作品alpha发布体会

    1.  俄罗斯方块   武志远 可以进行游戏,界面很友好,游戏运行也很流畅,并找到两名同学现场体验,游戏完成度很好. 2.  连连看游戏  张金生 可以进行游戏,实现了背景音乐播放等附加功能,界面清晰 ...

  4. Java 面试前的基础准备 - 01

    使用这个在线网页编辑真的是不习惯,还是 windows live writer 好. 下面列一个清单用于最近的面试:( 清单是网上down的 ) static,final,transient 等关键字 ...

  5. Delphi编程防止界面卡死的方法经验分享

    Delphi编程防止界面卡死的方法经验分享! 1.循环里面防止界面卡死的方法可以使用Application.ProcessMessages:  例如下列方法:    var      n: Integ ...

  6. tarjan强连通分量模板(pascal)

    友好城市 [问题描述]小 w 生活在美丽的 Z 国. Z 国是一个有 n 个城市的大国, 城市之间有 m 条单向公路(连接城市 i. j 的公路只能从 i 连到 j). 城市 i. j 是友好城市当且 ...

  7. 【bzoj2257】[Jsoi2009]瓶子和燃料 扩展裴蜀定理+STL-map

    题目描述 给出 $n$ 个瓶子和无限的水,每个瓶子有一定的容量.每次你可以将一个瓶子装满水,或将A瓶子内的水倒入B瓶子中直到A倒空或B倒满.从中选出 $k$ 个瓶子,使得能够通过这 $k$ 个瓶子凑出 ...

  8. 转--- 秒杀多线程第七篇 经典线程同步 互斥量Mutex

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...

  9. C 类网络的子网快速划分

    CIDR ( Classless Inter-Domain Routing ,无类域间路由选择) 进行子网划分的方法有很多,最适合你的方式就是正确的方式.在 C 类地址中,只有 8 位用于定义主机.注 ...

  10. Codeforces Round #447 (Div. 2) 题解

    A.很水的题目,3个for循环就可以了 #include <iostream> #include <cstdio> #include <cstring> using ...