64,649
社区成员
发帖
与我相关
我的任务
分享
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const LL maxn(200005), mod(1e9 + 7);
LL Jc[maxn];
void calJc() //求maxn以内的数的阶乘
{
Jc[0] = Jc[1] = 1;
for(LL i = 2; i < maxn; i++)
Jc[i] = Jc[i - 1] * i % mod;
}
//费马小定理求逆元
LL pow(LL a, LL n, LL p) //快速幂 a^n % p
{
LL ans = 1;
while(n)
{
if(n & 1) ans = ans * a % p;
a = a * a % p;
n >>= 1;
}
return ans;
}
LL niYuan(LL a, LL b) //费马小定理求逆元
{
return pow(a, b - 2, b);
}
LL C(LL a, LL b) //计算C(a, b)
{
if(a < b) return 0;
return Jc[a] * niYuan(Jc[b], mod) % mod
* niYuan(Jc[a - b], mod) % mod;
}
//快速幂
LL poww(int a,int b){
LL ans=1,base=a;
while(b!=0){
if(b&1!=0)
ans=ans*base%mod;
base=base*base%mod;
b>>=1;
}
return ans;
}
LL d[maxn]; //存放D数据
LL a[maxn]; //存放需要乘以多少次D[i]
int main()
{
calJc();//初始化
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>d[i];
}
for(int i=1;i<=n;i++)
{
LL a1,a2,a3=0;
a1=poww(4,i-1);
a2=poww(2,n-i+1);
a[i]=a1*a2%mod;
for(int k=0;k<=n-i;k++)
{
a3=a3+C(n-i,k)*(k+1)%mod;
a3=a3%mod;
}
a[i]=a[i]*a3%mod;
}
LL ans=0;
for(int i=1;i<=n;i++)
{
ans=ans+a[i]*d[i]%mod;
}
cout<<ans<<endl;
return 0;
}