$[Luogu]$ 洛谷 $CF908D$ 题解【New Year and Arbitrary Arrangement】

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]=(paf[i+1][j]+pbf[i][i+j])/(pa+pb)

但我们神奇的发现,这一题居然要取模QAQ

丧尽*良

于是我们一脸怨气地去学逆元1/逆元2

呼~~~终于学完逆元惹,然而我们惊奇地(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)

posted @ 2018-10-14 19:23  风骨傲天  阅读(179)  评论(0编辑  收藏  举报