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