比赛 |
2022级数学专题练习赛2 |
评测结果 |
AAAAAAAAAA |
题目名称 |
数列运算 |
最终得分 |
100 |
用户昵称 |
op_组撒头屯 |
运行时间 |
0.085 s |
代码语言 |
C++ |
内存使用 |
0.95 MiB |
提交时间 |
2022-12-19 21:32:59 |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1000000007;
const int N=100000+5;
int n;
ll a[N],pw[N],inv[N];
ll sum[N],ji[N];
ll fst(ll x,ll y){
if (!y)return 1;
if (y&1)return x*fst(x,y-1)%mod;
ll p=fst(x,y/2);return p*p%mod;
}
ll calc(ll x){
if (x<=4)return inv[4-x];
else return pw[x-4];
}
int main(){
freopen ("sequenceQBXT.in","r",stdin);
freopen ("sequenceQBXT.out","w",stdout);
scanf("%d",&n);
pw[0]=inv[0]=1;
for (int i=1;i<=n;i++)pw[i]=pw[i-1]*2%mod,inv[i]=fst(pw[i],mod-2);
sum[0]=1;
ll ans=0;ji[0]=1;
for (int i=1;i<=n;i++){
scanf("%lld",&a[i]);
ji[i]=ji[i-1]*a[i]%mod;
sum[i]=(sum[i-1]+ji[i]*pw[n-i+1]%mod)%mod;
if (i!=n)ans=(ans+ji[i]*pw[n-1-i]%mod)%mod;
else ans=(ans+ji[i])%mod;
}
for (int i=2;i<=n;i++){
ll now=1,iv=fst(ji[i-1],mod-2);
ll res=((sum[n-1]-sum[i-1])%mod+mod)%mod*iv%mod*calc(i)%mod;
ans=(ans+res)%mod;
ans=(ans+ji[n]*iv%mod*pw[i-2]%mod)%mod;
}
printf("%lld\n",ans);
return 0;
}