【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 概率神题的更多相关文章

  1. 【CodeForces】913 F. Strongly Connected Tournament 概率和期望DP

    [题目]F. Strongly Connected Tournament [题意]给定n个点(游戏者),每轮游戏进行下列操作: 1.每对游戏者i和j(i<j)进行一场游戏,有p的概率i赢j(反之 ...

  2. Codeforces913F. Strongly Connected Tournament

    n<=2000个人参加比赛,这样比:(这里的序号没按题目的)1.两两比一场,比完连个图,边i->j表示i赢了j.2.连完那个图强联通分量缩起来,强连通分量内继续比,即强连通分量递归进行1. ...

  3. @codeforces - 913F@ Strongly Connected Tournament

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

  4. Strongly Connected Tournament

    题解: 有一个很重要的性质就是 对于一张完全强联通图来说 一定有一个强联通分量入度为0(或者出度为0) 然后就一些计数题的基本套路 https://www.cnblogs.com/onioncyc/p ...

  5. 【BZOJ2554】Color 概率神题

    [BZOJ2554]Color Description 有n个球排成一列,每个球都有一个颜色,用A-Z的大写字母来表示,我们每次随机选出两个球ball1,ball2,使得后者染上前者的颜色,求期望操作 ...

  6. cf475B Strongly Connected City

    B. Strongly Connected City time limit per test 2 seconds memory limit per test 256 megabytes input s ...

  7. PTA Strongly Connected Components

    Write a program to find the strongly connected components in a digraph. Format of functions: void St ...

  8. POJ 2484 A Funny Game(神题!)

    一开始看这道博弈题的时候我就用很常规的思路去分析了,首先先手取1或者2个coin后都会使剩下的coin变成线性排列的长条,然后无论双方如何操作都是把该线条分解为若干个子线条而已,即分解为若干个子游戏而 ...

  9. BUAA 724 晴天小猪的神题(RMQ线段树)

    BUAA 724 晴天小猪的神题 题意:中文题,略 题目链接:http://acm.buaa.edu.cn/problem/724/ 思路:对于询问x,y是否在同一区间,可以转换成有没有存在一个区间它 ...

随机推荐

  1. PHP多文件上传操作

    在前一篇文章里讲到了关于PHP文件上传原理和简单操作举例是单文件上传. http://www.cnblogs.com/lichenwei/p/3879566.html 其实多文件上传和单文件上传大同小 ...

  2. lnmp无法删除.user.ini文件的解决办法

    有一次使用命令lnmp vhost del删除虚拟主机后,需要使用ftp或者rm命令删除网站目录,但是却发现网站目录下有个文件.user.ini文件没有自动删除,出现提示rm: cannot remo ...

  3. storm学习之六-使用Maven 生成jar包多种方式

    Maven可以使用mvn package指令对项目进行打包,如果使用java -jar xxx.jar执行运行jar文件,会出现"no main manifest attribute, in ...

  4. 最简单安装laravel

    http://laravelacademy.org/resources-download

  5. linux环境中,如何查看某个软件包,都依赖哪些软件包?被哪些软件包依赖?

    需求描述: 今天查看主机上的一个软件ghostscript,准备删除,就先看下这个软件都依赖哪些软件, 然后呢被哪些软件依赖 操作过程: 1.查看这个软件依赖哪些软件(rpm方式查询) [root@t ...

  6. Hibernate_day04讲义_使用Hibernate完成对客户的条件查询

  7. MongoDB中常用的find

    接着前一篇文章,下面主要介绍一下MongoDB中常用的find操作. 先打开MongoDB shell,通过下面一组命令插入一些数据. post1 = {} post2 = {} post3 = {} ...

  8. vue-resource和vue-axios的简单使用方法

    两者其实差别不大,都是基于es6的Promise对象实现的方法 vue-resource: main.js => import Vue from 'vue'; import VueResourc ...

  9. Oracle基本操作,Oracle修改列名,Oracle修改字段类型

    oracle基本操作,Oracle修改列名,Oracle修改字段类型 >>>>>>>>>>>>>>>>& ...

  10. ch3:文件处理与异常

    如何从文件读入数据? python中的基本输入机制是基于行的: python中标准的“打开-处理-关闭”代码: the_file=open('文件全称') #处理文件中的数据 the_file.clo ...