首先發出題目鏈接:
鏈接: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,拿藍球的概率是,則此情況的概率:
2.拿走了一個黑球,即有a[k]-1個黑球
則第k+1輪放了一個藍球(注意此時盒子裏應該有n+m+1個球,有a[k]個黑球),拿了一個黑球。
放藍球的概率是(1-p),拿黑球的概率是,則此情況的概率:
3.仍然是a[k]個黑球(此情況有兩種可能)
當第k+1輪放了一個藍球(注意此時盒子裏應該有n+m+1個球,有a[k]個黑球),則拿了一個藍球。
放藍球的概率是(1-p),拿藍球的概率是;
當第k+1輪放了一個黑球(注意此時盒子裏應該有n+m+1個球,有a[k]+1個黑球),則拿了一個黑球。
放黑球的概率是p,拿黑球的概率是
則此情況概率爲:
情況 | k+1輪後黑球個數 | 此情況概率 |
---|---|---|
多放了一個黑球 | a[k]+1 | |
拿走了一個黑球 | a[k]-1 | |
仍然是a[k]個球 | a[k] |
如上表所示,a[k+1]期望爲:
經化簡可得:
再找通項公式:
爲了方便計算,我們設嘗數q=
即:
爲了得到通項公式,再設常數x,使得
則qx-x=qp,解得
又因爲a[0]=n,可以得到:
是以爲首項,q爲公比的等比數列
則
即
最後,把代入,得到
分數統一化,得到
分數取模,找逆元:
最後期望
分子fa
分母fb
我們只考慮餘數,所以還需講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;
分數取模(),由於mod=1e9+7是一個質數,可以使用費馬小定理求解
(其中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以及求逆元公式,過於簡單,不用舉例子,注意要用快速冪求和
代碼如下:
#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);
}