#期望dp#51nod 2015 诺德街

时间:2021-10-14
本文章向大家介绍#期望dp#51nod 2015 诺德街,主要包括#期望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