#期望dp#51nod 2015 诺德街

题目传送门


分析

禁不住 QuantAsk 的诱惑(bushi)

考虑一条路线可以由若干段 (1-2-dots-n-dots-2) 以及 最后一段 (1-dots-x) 组成。

对于最后一段可以求出它的期望时间设为 (len) ,对于这若干段循环节,可以求出它的概率设为 (P)

那么最终的期望时间 (ans=P(ans+2n-2)+len)

也就是有 (P) 的概率会多走 (2n-2) 步,否则期望走 (len) 步终止

把方程解出来得到 (ans=frac{P(2n-2)+len}{1-P})


代码

#include <cstdio>
#define rr register
using namespace std;
const int mod=1000000007;
int n,A,B,C,len,P=1,p[2000011];
inline signed ksm(int x,int y){
    rr int ans=1;
    for (;y;y>>=1,x=1ll*x*x%mod)
        if (y&1) ans=1ll*ans*x%mod;
    return ans;
}
signed main(){
	scanf("%d%d%d%d%d",&n,&p[1],&A,&B,&C);
	for (rr int i=2;i<=n;++i) p[i]=p[n*2-i]=(1ll*A*p[i-1]%mod*p[i-1]+1ll*B*p[i-1]+C)%mod;
	for (rr int i=1;i<2*n-1;++i){
		len=(len+(i-1ll)*P%mod*p[i]%mod)%mod;
		P=(mod-p[i]+1ll)*P%mod;
	}
	len=(len+P*(2ll*n-2)%mod)%mod;
	return !printf("%lld",1ll*len*ksm(mod-P+1,mod-2)%mod);
} 
原文地址:https://www.cnblogs.com/Spare-No-Effort/p/15405350.html