牛客練習賽46----C-華華跟奕奕玩遊戲

首先發出題目鏈接:
鏈接:https://ac.nowcoder.com/acm/contest/894/C
來源:牛客網
涉及:逆元,遞推式


題目如下:
在這裏插入圖片描述
在這裏插入圖片描述
關於這個題首先要抓住一個重點,就是每一輪過後,期望就會發現變化,即:

相鄰兩輪遊戲後的期望值是有一個遞推關係的

假設第kk輪後黑球數量的期望是a[k]

只要先找到a[k]與a[k+1]的關係,然後通過遞推關係找到a[k]的通項公式,並把a[k]的通項公式表示爲分數的形式,然後利用分數取模找逆元,就可以得到答案。


首先找遞推公式:

由於每一輪遊戲都會放入一個球,並拿走一個球,所以盒子中球的數量肯定是不變的

由於第k輪後盒子裏還剩a[k]個球,那麼第k+1輪後,盒子裏的黑球數量只有三種可能:
  1.多放了一個黑球,即有a[k]+1個球;
  2.仍然是a[k]個球;
  3.拿走了一個黑球,即有a[k]-1個球;

在來考慮每一種情況的概率:
1.多放了一個黑球,即有a[k]+1個黑球
 則第k+1輪放了一個黑球(注意此時盒子裏應該有n+m+1個球,有a[k]+1個黑球),拿了一個藍球。
 
放黑球的概率是p,拿藍球的概率是n+m+1a[k]1n+m+1\frac{n+m+1-a[k]-1}{n+m+1},則此情況的概率:
p(n+m+1a[k]1)n+m+1\frac{p*(n+m+1-a[k]-1)}{n+m+1}
 
2.拿走了一個黑球,即有a[k]-1個黑球
 則第k+1輪放了一個藍球(注意此時盒子裏應該有n+m+1個球,有a[k]個黑球),拿了一個黑球。

放藍球的概率是(1-p),拿黑球的概率是a[k]n+m+1\frac{a[k]}{n+m+1},則此情況的概率:
(1p)a[k]n+m+1\frac{(1-p)*a[k]}{n+m+1}
 
3.仍然是a[k]個黑球(此情況有兩種可能)
 當第k+1輪放了一個藍球(注意此時盒子裏應該有n+m+1個球,有a[k]個黑球),則拿了一個藍球。
 
放藍球的概率是(1-p),拿藍球的概率是n+m+1a[k]n+m+1\frac{n+m+1-a[k]}{n+m+1}
 
 當第k+1輪放了一個黑球(注意此時盒子裏應該有n+m+1個球,有a[k]+1個黑球),則拿了一個黑球。
 
放黑球的概率是p,拿黑球的概率是a[k]+1n+m+1\frac{a[k]+1}{n+m+1}

則此情況概率爲:
(1p)(n+m+1a[k])n+m+1+p(a[k]+1)n+m+1\frac{(1-p)*(n+m+1-a[k])}{n+m+1}+\frac{p*(a[k]+1)}{n+m+1}

情況 k+1輪後黑球個數 此情況概率
多放了一個黑球 a[k]+1 p(n+m+1a[k]1)n+m+1\frac{p*(n+m+1-a[k]-1)}{n+m+1}
拿走了一個黑球 a[k]-1 (1p)a[k]n+m+1\frac{(1-p)*a[k]}{n+m+1}
仍然是a[k]個球 a[k] (1p)(n+m+1a[k])n+m+1+p(a[k]+1)n+m+1\frac{(1-p)*(n+m+1-a[k])}{n+m+1}+\frac{p*(a[k]+1)}{n+m+1}

如上表所示,a[k+1]期望爲:
[a[k]+1n+m+1a[k]+n+m+1a[k]1n+m+1(a[k]+1)]p+[n+m+1a[k]n+m+1a[k]+a[k]n+m+1(a[k]1)](1p)[\frac{a[k]+1}{n+m+1}a[k]+\frac{n+m+1-a[k]-1}{n+m+1}(a[k]+1)]p+[\frac{n+m+1-a[k]}{n+m+1}a[k]+\frac{a[k]}{n+m+1}(a[k]-1)](1-p)
經化簡可得:
a[k+1]=(a[k]+p)n+mn+m+1a[k+1]=(a[k]+p)\frac{n+m}{n+m+1}


再找通項公式:

爲了方便計算,我們設嘗數q=n+mn+m+1\frac{n+m}{n+m+1}

即:
a[k+1]=q(a[k]+p)=qa[k]+qpa[k+1]=q(a[k]+p)=q*a[k]+qp

爲了得到通項公式,再設常數x,使得
a[k+1]+x=q(a[k]+x)=qa[k]+qxa[k+1]+x=q(a[k]+x)=q*a[k]+qx

則qx-x=qp,解得
x=qpq1x=\frac{qp}{q-1}

又因爲a[0]=n,可以得到:

a[k]+qpq1a[k]+\frac{qp}{q-1}是以(n+qpq1)(n+\frac{qp}{q-1})爲首項,q爲公比的等比數列


a[k]+qpq1=(n+qpq1)qk (k0)a[k]+\frac{qp}{q-1}=(n+\frac{qp}{q-1})*q^{k} (k\ge0)

a[k]=(n+qpq1)qkqpq1 (k0)a[k]=(n+\frac{qp}{q-1})*q^{k}-\frac{qp}{q-1} (k\ge0)
最後,把p=ab,q=n+mn+m+1p=\frac{a}{b},q=\frac{n+m}{n+m+1}代入,得到
a[k]=[nab(n+m)](n+m)k(n+m+1)k+ab(n+m)a[k]=[n-\frac{a}{b}(n+m)]\frac{(n+m)^{k}}{(n+m+1)^{k}}+\frac{a}{b}(n+m)
分數統一化,得到
a[k]=(bnanam)(n+m)k+a(n+m)(n+m+1)kb(n+m+1)k  (k0)a[k]=\frac{(bn-an-am)(n+m)^{k}+a(n+m)(n+m+1)^{k}}{b(n+m+1)^{k}}  (k\ge0)


分數取模,找逆元:

最後期望
分子fa
fa=(bnanam)(n+m)k+a(n+m)(n+m+1)kfa=(bn-an-am)(n+m)^{k}+a(n+m)(n+m+1)^{k}
分母fb
fb=b(n+m+1)kfb=b(n+m+1)^{k}
我們只考慮餘數,所以還需講fa與fb對mod取餘

ll pa=qPow_function(n+m+1,k,mod);
ll pb=qPow_function(n+m,k,mod);
ll fa=((b*n%mod-a*n%mod-a*m%mod)*pb%mod+((a*(n+m)%mod)%mod*pa)%mod)%mod;//多用取餘,不然很可能就爆
ll fb=b*pa%mod;

分數取模(abMODp\frac{a}{b}MOD p),由於mod=1e9+7是一個質數,可以使用費馬小定理求解

abMODp=(ac)MODp\frac{a}{b}MOD p=(a*c)MODp
(其中c是b MOD p的逆元,mod是質數,因此c=bp-2%p)

ll ni=qPow_function(fb,mod-2,mod);//ni是逆元
return !(cout<<(fa*ni%mod+mod)%mod);//注意fa可能是負數,所以要再加mod並模上mod

舉例子:
過程只有套fa和fb以及求逆元公式,過於簡單,不用舉例子,注意要用快速冪(n+m)k(n+m)^{k}(n+m+1)k(n+m+1)^{k}


代碼如下:

#include <iostream>
#define mod (ll)1000000007
using namespace std;
typedef long long ll;
ll n,m,k,a,b;
long long qPow_function(long long _x,long long _divisor,long long _mod){//快速冪
    long long sum=1;
    while(_divisor){
        if(_divisor&1)    sum=sum*_x%_mod;
        _divisor=_divisor>>1;
        _x=_x*_x%_mod;
    }
    return sum;
}
int main(){
	cin>>n>>m>>k>>a>>b;
	ll pa=qPow_function(n+m+1,k,mod);//pa是(n+m+1)的k次方
	ll pb=qPow_function(n+m,k,mod);//pb是(n+m)的k次方
	ll fa=((b*n%mod-a*n%mod-a*m%mod)*pb%mod+((a*(n+m)%mod)%mod*pa)%mod)%mod;//套fa公式得分子
	ll fb=b*pa%mod;//套公式
	ll ni=qPow_function(fb,mod-2,mod);//求fb模mod的逆元
	return !(cout<<(fa*ni%mod+mod)%mod);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章