牛客等级之题 N1(8.3) 题解

题目传送门

题目大意: 一开始箱子里有 n n n 个黑球 m m m 个白球,每次有 p p p 的概率放进去一个黑球,有 1 − p 1-p 1p 的概率放进去一个白球,放完球后再随机拿一个球,问进行 k k k 次后箱子里黑球期望个数。

题解

可以注意到每次操作后球数是保持在 n + m n+m n+m 不会变的。

a i a_i ai 表示进行 i i i 次操作后黑球的期望个数,显然有 a 0 = n a_0=n a0=n

有四种情况需要考虑,其中两种是放一个黑球拿一个黑球放一个白球拿一个白球,这两种不会引起黑球数变化所以不需要考虑。

放一个黑球拿一个白球的概率为: A = p × n + m + 1 − ( a i + 1 ) n + m + 1 A=p\times \dfrac {n+m+1-(a_i+1)} {n+m+1} A=p×n+m+1n+m+1(ai+1),贡献为 1 1 1,因为多了一个黑球。

放一个白球拿一个黑球的概率为: B = ( 1 − p ) × a i n + m + 1 B=(1-p)\times \dfrac {a_i} {n+m+1} B=(1p)×n+m+1ai,贡献为 − 1 -1 1,因为少了一个黑球。

整理得到: a i + 1 = a i + A × 1 + B × ( − 1 ) = ( p + a i ) n + m n + m + 1 a_{i+1}=a_i+A\times 1+B\times (-1)=(p+a_i)\dfrac {n+m} {n+m+1} ai+1=ai+A×1+B×(1)=(p+ai)n+m+1n+m

T = n + m n + m + 1 T=\dfrac {n+m} {n+m+1} T=n+m+1n+m,那么有 a i + 1 = T a i + p T a_{i+1}=Ta_i+pT ai+1=Tai+pT,展开得到 a i = T i a 0 + p T ( 1 + T + T 2 + . . . + T i − 1 ) a_i=T^ia_0+pT(1+T+T^2+...+T^{i-1}) ai=Tia0+pT(1+T+T2+...+Ti1),于是就可以 O ( log ⁡ k ) O(\log k) O(logk) 计算答案了。

代码如下:

#include <cstdio>
#define mod 1000000007

int n,m,k,a,b;
int ksm(int x,int y){
    
    int re=1;for(;(y&1?re=1ll*re*x%mod:0),y;x=1ll*x*x%mod,y>>=1);return re;}
#define inv(x) ksm(x,mod-2)

int main()
{
    
    
	scanf("%d %d %d %d %d",&n,&m,&k,&a,&b);
	int p=1ll*a*inv(b)%mod,T=1ll*(n+m)*inv(n+m+1)%mod;
	printf("%d",(1ll*ksm(T,k)*n%mod+1ll*p*T%mod*(ksm(T,k)-1+mod)%mod*inv(T-1)%mod)%mod);
}

猜你喜欢

转载自blog.csdn.net/a_forever_dream/article/details/107790209