这是一个神奇的DP,不过用来练一下期望DP也是很好的
有助理解嘛~~~
我们不妨设f[i][j]为前缀中i个a,j个ab停止后的期望长度,这样我们转移起来就方便多啦QAQ
丢方程:f[i][j]=(pa*f[i+1][j]+pb*f[i][i+j])/(pa+pb)f[i][j]=(pa?f[i+1][j]+pb?f[i][i+j])/(pa+pb)
但我们神奇的发现,这一题居然要取模QAQ
丧尽*良
呼~~~终于学完逆元惹,然而我们惊奇地(di)发现,这一题竟然变得不难了QAQ
好啦,粘代码
#include<bits/stdc++.h>
using namespace std;
int k,pa,pb;
int A,B;
int f[1005][1005];
const int p=1000000007;
inline int ksm(int b,int pp)
{
pp--;
int a=b;
while(pp>0)
{
if(pp%2==1) a=(b*a)%p;
b=(b*b)%p;
pp/=2;
}
return a%p;
}
int dp(int i,int j)
{
if(i+j>=k) return (i+j+1LL*pa*ksm(pb,p-2)%p)%p;
if(f[i][j]!=0x3f3f3f3f) return f[i][j];
return f[i][j]=(1LL*((1LL*pa*dp(i+1,j))%p+(1LL*pb*dp(i,i+j))%p)*ksm(pb+pa,p-2))%p;
}
int main(){
cin>>k>>pa>>pb;
memset(f,0x3f3f3f3f,sizeof(f));
cout<<dp(1,0);
}
后话:我当时觉得DP太难打了,就去打了记搜QAQ
其实是我不会打DP
有想要DP型题解的找Itst大佬
不要想着抄题解哦,我可是做了一些修改的呢(程序主体上无误,但是会让你WA而不是CE)