emmm,居然没有提解,本蒟蒻来一本正经地发一篇
这是一个神奇的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)