51nod2015 诺德街

2015 诺德街

又仁慈、又善良、又有钱的夹克老爷买下了一条街!
懂得经商的夹克老爷决定沿街开n个店铺,从南到北编号为1~n。经过紧张的筹备之后,诺德街的n个店铺同时开张了。由于刚开业,夹克老爷的人手不是非常足够,所以需要夹克老爷自己去干活。然而夹克老爷的手下们干活不积极,使得第i个店铺在每分钟都有pi的概率无人营业,且每分钟之间相互独立。于是夹克老爷从1号店铺出发向北走,当遇到第一个无人营业的店铺时就进去营业而停止移动。如果一直走到第n个店铺都有人营业,则原路返回,然后不停地来回走直到遇到一个无人营业的店铺为止。现在夹克老爷想知道,自己期望走多少分钟。假设夹克老爷从一个店铺到下一个店铺需要1分钟。

样例解释:夹克老爷的路线为1-2-3-4-3-2-1-2-...每次都有1/2的概率遇到无人营业的店铺,所以期望时间是1。

输入

第一行输入一个整数n(n<=1000000),表示诺德街的长度。
接下来有4个整数p1,a,b,c(0<=p1,a,b,c<1e9+7),p1即第一个店铺的概率,
接下来对于i>1,p[i]=(a * p[i-1] * p[i-1] + b * p[i-1] + c) mod 1e9+7,保证pi不全为0。

输出

输出共一行,一个整数,表示夹克老爷的期望时间对1e9+7取模的值。

输入样例

4
500000004 0 0 500000004

输出样例

1

放代码:

#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);
} 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值