CodeforcesF. Strongly Connected Tournament

n<=2000个人参加比赛,这样比:(这里的序号没按题目的)1、两两比一场,比完连个图,边i->j表示i赢了j。2、连完那个图强联通分量缩起来,强连通分量内继续比,即强连通分量递归进行1、2,直到每个强连通分量大小为1.i<j时i有a/b的概率赢j,问每个人比赛的场数的总和的期望,答案%998244353。

n个人搞完一次会有大大小小的联通块,就可以递归下去了!但是每次可能分出很多种情况,怎么算呢?选他的一个每种图一定有的强连通分量来枚举即可,那就枚举拓扑序最后的那一个分量,也就是输给了除分量外所有人的那些人组成的,吧!$Ans_i$--i个人答案,$Ans_i=\sum_{j=1}^{i}str_j*cp_{i,j}*(\frac{j(j-1)}{2}+j(i-j)+Ans_i+Ans_{s-i})$,其中$str_i$表示i个点成强连通分量的概率,$cp_{i,j}$表示i个点中j个点输给其他所有人这件事发生的概率。注意到$Ans_i$在$j=i$时会转移到自己,移个项除个系数即可,略。而$str_i=1-\sum_{j=1}^{i-1}str_j*cp_{i,j}$,$cp_{i,j}=cp_{i-1,j-1}p^{i-j}*cp_{i-1,j}(1-p)^j,cp_{i,0}=1$。

 1 #include<string.h>
 2 #include<stdlib.h>
 3 #include<stdio.h>
 4 //#include<assert.h>
 5 #include<algorithm>
 6 //#include<iostream>
 7 using namespace std;
 8
 9 int n,a,b,p;
10 #define maxn 2011
11 const int mod=998244353;
12 int cp[maxn][maxn],str[maxn],ans[maxn];
13
14 int powmod(int a,int b)
15 {
16     int ans=1;
17     while (b)
18     {
19         if (b&1) ans=1ll*ans*a%mod;
20         a=1ll*a*a%mod;
21         b>>=1;
22     }
23     return ans;
24 }
25
26 int list1p[maxn],listp[maxn];
27 int main()
28 {
29     scanf("%d%d%d",&n,&a,&b); p=1ll*a*powmod(b,mod-2)%mod;
30     cp[0][0]=1;
31     list1p[0]=1; for (int i=1;i<=n;i++) list1p[i]=list1p[i-1]*1ll*(mod+1-p)%mod;
32     listp[0]=1; for (int i=1;i<=n;i++) listp[i]=listp[i-1]*1ll*p%mod;
33     for (int i=1;i<=n;i++)
34     {
35         cp[i][0]=1;
36         for (int j=1;j<=i;j++) cp[i][j]=list1p[j]*1ll*cp[i-1][j]%mod+listp[i-j]*1ll*cp[i-1][j-1]%mod,
37         cp[i][j]-=cp[i][j]>=mod?mod:0;
38     }
39     str[1]=1;
40     for (int i=2;i<=n;i++)
41     {
42         str[i]=1;
43         for (int j=1;j<i;j++) str[i]-=str[j]*1ll*cp[i][j]%mod,str[i]+=str[i]<0?mod:0;
44     }
45     ans[0]=ans[1]=0;
46     for (int i=2;i<=n;i++)
47     {
48         ans[i]=(str[i]*1ll*cp[i][i]%mod)*i*(i-1)%mod*((mod+1)>>1)%mod;
49         for (int j=1;j<i;j++) ans[i]+=str[j]*1ll*cp[i][j]%mod*(1ll*j*(j-1)%mod*((mod+1)>>1)%mod
50         +1ll*j*(i-j)%mod+ans[j]+ans[i-j])%mod,ans[i]-=ans[i]>=mod?mod:0;
51         ans[i]=1ll*ans[i]*powmod(mod+1-str[i]*1ll*cp[i][i],mod-2)%mod;
52     }
53     printf("%d\n",ans[n]);
54     return 0;
55 }

原文地址:https://www.cnblogs.com/Blue233333/p/8253849.html

时间: 2024-10-05 05:04:57

CodeforcesF. Strongly Connected Tournament的相关文章

【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

【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

@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,直到每一个强连通分量内只剩一个选手.

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\) 个点打败的概率. 这

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

HDU 4635 Strongly connected (有向图的强连通分量)

Strongly connected Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description Give a simple directed graph with N nodes and M edges. Please tell me the maximum number of the edges you can add that the grap

[tarjan] hdu 4635 Strongly connected

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4635 Strongly connected Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1568    Accepted Submission(s): 654 Problem Description Give a simple dir

HDU 4635 Strongly connected(强连通)经典

Strongly connected Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1828    Accepted Submission(s): 752 Problem Description Give a simple directed graph with N nodes and M edges. Please tell me