1. 程式人生 > >CodeforcesF. Strongly Connected Tournament

CodeforcesF. Strongly Connected Tournament

會有 比賽 lap spl play pac assert 序號 ted

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 }
View Code

CodeforcesF. Strongly Connected Tournament