比赛 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;
}