【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;
}

原文地址:https://www.cnblogs.com/CQzhangyu/p/8283069.html

时间: 2024-10-04 00:05:01

【CF913F】Strongly Connected Tournament 概率神题的相关文章

CF913F Strongly Connected Tournament

题面 题解 设 \(f(n)\) 表示 \(n\) 个人比赛总场数的期望值,通过枚举拓补序最后的强连通分量可得: \[ f(n) = \sum_{i = 1}^n s(i)c(n, i)\left[f(i) + f(n - i) + i(n - i) + \frac{i(i - 1)}2 \right] \] 其中 \(s(n)\) 表示 \(n\) 个点能够形成强连通分量的概率,\(c(n, i)\) 表示 \(n\) 个点中有 \(i\) 个点被剩下 \(n - i\) 个点打败的概率. 这

【CodeForces】913 F. Strongly Connected Tournament

[题目]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 [题解]参考:官方题解Hello 201

CodeforcesF. Strongly Connected Tournament

n<=2000个人参加比赛,这样比:(这里的序号没按题目的)1.两两比一场,比完连个图,边i->j表示i赢了j.2.连完那个图强联通分量缩起来,强连通分量内继续比,即强连通分量递归进行1.2,直到每个强连通分量大小为1.i<j时i有a/b的概率赢j,问每个人比赛的场数的总和的期望,答案%998244353. n个人搞完一次会有大大小小的联通块,就可以递归下去了!但是每次可能分出很多种情况,怎么算呢?选他的一个每种图一定有的强连通分量来枚举即可,那就枚举拓扑序最后的那一个分量,也就是输给了

@codeforces - [email&#160;protected] Strongly Connected Tournament

目录 @[email protected] @[email protected] @accepted [email protected] @[email protected] @[email protected] n 个选手参加了一场竞赛,这场竞赛的规则如下: 1.一开始,所有选手两两之间独立进行比赛(没有平局). 2.主办方将胜者向败者连边形成 n 个点的竞赛图. 3.主办方对这个竞赛图进行强连通分量缩点. 4.每一个强连通分量内部的选手重复步骤 1~3,直到每一个强连通分量内只剩一个选手.

Codeforces 475B Strongly Connected City 强连通裸题

题目链接:点击打开链接 题意: 就是n*m的矩阵, 每行能走的方向 每列能走的方向 问:图是否强连通. 只要4个边界成环即可. 或者无脑tarjan == #pragma comment(linker, "/STACK:102400000,102400000") #include <stdio.h> #include <iostream> #include <algorithm> #include <vector> #include &l

Strongly connected

hdu4635:http://acm.hdu.edu.cn/showproblem.php?pid=4635 题意:给你一个有向图,然后问你最多可以加多少条边,是的原图不是一个强连通图. 题解:这一题确实不会,图论做的太少了,一下是一个人分析,觉得分析的很不错,代码也是看别人的. 首先强连通缩点,缩点之后,最终添加完边的图,肯定可以分成两个部X和Y,其中只有X到Y的边没有Y到X的边;  *那么要使得边数尽可能的多,则X部肯定是一个完全图,Y部也是,同时X部中每个点到Y部的每个点都有一条边;  *

CodeForces 171F(千古神题。。)

 D - 乐 Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 171F Description qd ucyhf yi q fhycu dkcruh mxeiu huluhiu yi q tyvvuhudj fhycu dkcruh. oekh jqia yi je vydt jxu djx ucyhf. Input j

PTA Strongly Connected Components

Write a program to find the strongly connected components in a digraph. Format of functions: void StronglyConnectedComponents( Graph G, void (*visit)(Vertex V) ); where Graph is defined as the following: typedef struct VNode *PtrToVNode; struct VNode

HDU 4635 —— Strongly connected——————【 强连通、最多加多少边仍不强连通】

Strongly connected Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 4635 Description Give a simple directed graph with N nodes and M edges. Please tell me the maximum number of the edges you can