【CF913F】Strongly Connected Tournament 概率神题
【CF913F】Strongly Connected Tournament
题意:有n个人进行如下锦标赛:
1.所有人都和所有其他的人进行一场比赛,其中标号为i的人打赢标号为j的人(i<j)的概率为$p=a\over b$。
2.经过过程1后我们相当于得到了一张竞赛图,将图中所有强联通分量缩到一起,可以得到一个链,然后对每个大小>1的强联通分量重复过程1。
3.当没有大小>1的强连通分量时锦标赛结束。
现在给出n,a,b,求期望比赛的场数。
$n\le 2000,a<b\le 1000$
题解:神题。先给出DP方程:
$ans(0)=ans(1)=0$
$ans(i)=\sum\limits_{j=1}^istrong(j)\times cp(i,j) \times (\frac {j(j-1)} 2+j(i-j)+ans(j)+ans(i-j)),i>1$
解释一下,我们此处相当于枚举了链上最后一个强联通分量的大小。其中strong(j)表示一个大小为j的点集是强连通分量的概率,cp(i,j)表示i中选出j个人使得这j个人全部输给了余下i-j个人的概率。注意这个方程的左右两边都有ans(i)这一项,我们到时候应该移项处理。
如何求strong(i)呢?我们考虑容斥,枚举其中出现一个大小<i的强联通分量的概率,即:
$strong(i)=1-\sum\limits_{j=1}^{i-1}strong(j)\times cp(i,j)$
如何求cp(i,j)呢?求法类似于组合数的递推方法。我们考虑i中标号最大的那个人,便能得到:
$cp(i,j)=cp(i-1,j-1)\times (1-p)^{i-j}+cp(i-1,j)\times p^j$
时间复杂度$O(n^2)$。
#include <cstdio>
#include <cstring>
#include <iostream> using namespace std;
typedef long long ll;
const ll P=998244353;
int n;
ll p;
ll c[2010][2010],s[2010],f[2010],p0[2010],p1[2010];
inline ll pm(ll x,ll y)
{
ll z=1;
while(y)
{
if(y&1) z=z*x%P;
x=x*x%P,y>>=1;
}
return z;
}
int main()
{
scanf("%d",&n);
int i,j,a,b;
scanf("%d%d",&a,&b),p=a*pm(b,P-2)%P;
f[0]=f[1]=0,s[1]=1;
for(p0[0]=p1[0]=1,i=1;i<=n;i++) p0[i]=p0[i-1]*p%P,p1[i]=p1[i-1]*(1-p)%P;
for(i=0;i<=n;i++)
{
c[i][0]=1;
for(j=1;j<=i;j++) c[i][j]=(c[i-1][j]*p1[j]+c[i-1][j-1]*p0[i-j])%P;
}
for(i=1;i<=n;i++)
{
s[i]=1;
for(j=1;j<i;j++) s[i]=(s[i]-s[j]*c[i][j])%P;
}
for(i=2;i<=n;i++)
{
ll tmp=0;
for(j=1;j<i;j++) tmp=(tmp+s[j]*c[i][j]%P*(f[j]+f[i-j]+j*(j-1)/2+j*(i-j)))%P;
tmp=(tmp+s[i]*(i*(i-1)/2))%P;
f[i]=tmp*pm(1-s[i],P-2)%P;
}
printf("%lld",(f[n]+P)%P);
return 0;
}
【CF913F】Strongly Connected Tournament 概率神题的更多相关文章
- 【CodeForces】913 F. Strongly Connected Tournament 概率和期望DP
[题目]F. Strongly Connected Tournament [题意]给定n个点(游戏者),每轮游戏进行下列操作: 1.每对游戏者i和j(i<j)进行一场游戏,有p的概率i赢j(反之 ...
- Codeforces913F. Strongly Connected Tournament
n<=2000个人参加比赛,这样比:(这里的序号没按题目的)1.两两比一场,比完连个图,边i->j表示i赢了j.2.连完那个图强联通分量缩起来,强连通分量内继续比,即强连通分量递归进行1. ...
- @codeforces - 913F@ Strongly Connected Tournament
目录 @description@ @solution@ @accepted code@ @details@ @description@ n 个选手参加了一场竞赛,这场竞赛的规则如下: 1.一开始,所有 ...
- Strongly Connected Tournament
题解: 有一个很重要的性质就是 对于一张完全强联通图来说 一定有一个强联通分量入度为0(或者出度为0) 然后就一些计数题的基本套路 https://www.cnblogs.com/onioncyc/p ...
- 【BZOJ2554】Color 概率神题
[BZOJ2554]Color Description 有n个球排成一列,每个球都有一个颜色,用A-Z的大写字母来表示,我们每次随机选出两个球ball1,ball2,使得后者染上前者的颜色,求期望操作 ...
- cf475B Strongly Connected City
B. Strongly Connected City time limit per test 2 seconds memory limit per test 256 megabytes input s ...
- PTA Strongly Connected Components
Write a program to find the strongly connected components in a digraph. Format of functions: void St ...
- POJ 2484 A Funny Game(神题!)
一开始看这道博弈题的时候我就用很常规的思路去分析了,首先先手取1或者2个coin后都会使剩下的coin变成线性排列的长条,然后无论双方如何操作都是把该线条分解为若干个子线条而已,即分解为若干个子游戏而 ...
- BUAA 724 晴天小猪的神题(RMQ线段树)
BUAA 724 晴天小猪的神题 题意:中文题,略 题目链接:http://acm.buaa.edu.cn/problem/724/ 思路:对于询问x,y是否在同一区间,可以转换成有没有存在一个区间它 ...
随机推荐
- C# 异步锁【转】
原文:http://www.yalongyang.com/2013/01/c-sharp-await-lock/ 在C#中,普通用锁很简单 object m_lock = new object(); ...
- 父组件中vuex方法更新state,子组件不能及时更新并渲染的解决方法
场景: 我实际用到的是这样的,我父组件引用子组件related,父组件调用获取页面详情的方法,更新了state值related,子组件根据该related来渲染相关新闻内容,但是页面打开的时候总是先加 ...
- idea中mybatis generator自动生成代码配置 数据库是sqlserver
好长时间没有写博客了,最近公司要用java语言,开始学习java,属于初学者,今天主要记录一下mybatis generator自动生成代码,首先在如下图的目录中新建两个文件,如下图 generato ...
- python中的List 和 Tuple
#-*- coding:UTF-8 -*- classmates=["Michael","Bob","Tracy"] print(class ...
- Java 代码块:静态代码块、构造代码块、构造函数块
Class : StaticFa package edu.bai.du.lime.staticCode; public class StaticFa { // 随着类的声明而执行 static { S ...
- windows防火墙设置端口开放技巧
选择“打开或者关闭windows防火墙”把防火墙打开,然后选择“高级设置”,选择“创建规则”来指定端口.(这里也可以在“入站规则”里选择已经存在的端口.) 指定ip开放3389端口 某新服务器,开放8 ...
- vmware下虚拟机不能上网问题解决
这个问题困扰了好久,vmware下装的虚拟机可以通过DHCP获取单独IP,但当用到管控较严格的环境,需要它与主机共享IP时,就不好使了. 今天在一篇文章中找到答案,如下图,windows系统中要启动V ...
- Linux误删文件后恢复数据
在Linux下,基于开源的数据恢复工具有很多,常见的有debugfs.R-Linux.ext3grep.extundelete等,比较常用的有ext3grep和extundelete,这两个工具的恢复 ...
- C++ template —— 模板基础(一)
<C++ Template>对Template各个方面进行了较为深度详细的解析,故而本系列博客按书本的各章顺序编排,并只作为简单的读书笔记,详细讲解请购买原版书籍(绝对物超所值).---- ...
- 使用java中的session来记录访问次数
<%@ page import="java.net.CookieHandler" %><%-- Created by IntelliJ IDEA. User: D ...