标签:bug hit unix cli hwm tmp ogr fms tcap
我想大声告诉你
这个题的题意似乎表达的不清楚.个人认为题意与"MZL‘s game‘"这题差不多.
题目的大意就是,n个人,进行几轮游戏.每一轮,先挑出一个没有被选中过,且没有出局的人,让他发动一次攻击.
这次攻击的范围是其他没有出局也没有被选中过的人.每个人有p的概率出局.
最后问你,对所有k∈[0,n),求一个人出局时恰好被攻击k次的概率.
这题的处理方法还是有点妙的.
首先,我们把这个问题转化为在1~n顺次选取一个人去攻击其他人,如果被选者已经出局,则直接选取下一个人即可.我们完全可以先处理出一个人的人受到j次攻击后存活的概率.
我们再设f[i][j]表示选取第i个人时,i到n的人都受到了j次攻击的概率,转移方程:
f[i][j] = f[i-1][j-1]*p1(第i-1个人受到j-1次攻击后没有出局的概率)+f[i-1][j]*p2(第i-1个人在j次攻击内出局的概率).
因为假设第i-1个人没有出局,就会对i~n的人都进行一次攻击(因为我们是从1到n一个一个扫过去的,如果第i-1个人没有出局,它将被扫到);
仅仅当第i-1个人在之前的攻击中出局,后面的人才不会受到i-1的攻击.
最后,我们来计算一下ans.
怎么样会使一个人(设为i)被攻击x次之后出局?即i-1成功的没有出局,那么i有可能在被攻击x次后出局.
当然,我们最后的概率要除以n,取平均概率.
当然,在mod时,不能用除法,而应该运用乘法逆元,逆元嘛......问问度娘就好啦.
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #define LL long long 6 using namespace std; 7 const LL TT=258280327; 8 LL n,x,y,inv,pro,pro_live[2005],f[2005][2005]; 9 inline LL Q_powers(LL b,LL p){ 10 if (!p) return 1; 11 LL t=Q_powers(b,p/2)%TT; t=(t*t)%TT; 12 if (p%2) return (t*b)%TT; else return t; 13 } 14 inline LL getinv(LL x){return Q_powers(x%TT,TT-2);} 15 int main(){ 16 int T; cin>>T; 17 for (; T; T--,putchar(‘\n‘)){ 18 cin>>n>>x>>y,inv=getinv(y),pro=((y-x)*inv)%TT,pro_live[0]=1; 19 for (int i=1; i<=n; i++) pro_live[i]=(pro_live[i-1]*pro)%TT; 20 f[0][0]=1; 21 for (int i=1; i<=n; i++) 22 for (int j=1; j<=i; j++) 23 f[i][j]=f[i-1][j]*(TT+1-pro_live[j])%TT+f[i-1][j-1]*(pro_live[j-1])%TT; 24 cout<<getinv(n)<<‘ ‘; 25 for (int j=1; j<n; j++){ 26 LL ans=0; 27 for (int i=1; i<=n; i++) ans=(ans+f[i-1][j]*pro_live[j])%TT; 28 cout<<(ans*getinv(n))%TT<<‘ ‘; 29 } 30 } 31 return 0; 32 }
标签:bug hit unix cli hwm tmp ogr fms tcap
原文地址:http://www.cnblogs.com/whc200305/p/7290564.html