-------
令a[1..,k,...n]={0,0,0,....,1,.....,0,0,0}
暴力求解答案就能达到a[k]对答案的贡献c[k]
暴力打个表,设Y[i][j]=杨辉三角第i层第j项
不难发现
当n为偶数时:
n/2为奇数时:
c[2*k+1]=c[2*k+2]=Y[n/2][k]
n/2为偶数时:
c[2*k+1]=Y[n/2][k]
c[2*k+2]=-Y[n/2][k]
而当n为奇数时,加减一遍,得到n−1个数,而此时这n−1个数必然是首先用加法处理
也就是说n为奇数时,处理一下就变为偶数的情况了
#include<stdio.h>
#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define MEM(a,x) memset(a,x,sizeof(a))
#define lowbit(x) ((x)&-(x))
using namespace std;
const int inf=0x3f3f3f3f;
const int MOD = 1e9+7;
const int N = 200000 + 5;
ll a[N],c[N],fact[N];
void initFact(){
fact[0]=fact[1]=1;
for(int i=2;i<N;++i){
fact[i]=(i*fact[i-1])%MOD;
}
}
ll ny(ll x){
int n=MOD-2;
ll ans=1,t=x;
while(n){
if(n&1){
ans=(ans*t)%MOD;
}
n>>=1;
t=(t*t)%MOD;
}
return ans;
}
ll C(ll n,ll k){
ll fz=fact[n];
ll fm=(fact[n-k]*fact[k])%MOD;
fm=ny(fm);
return (fz*fm)%MOD;
}
int slove(int n){
int tn=n/2;
int idx=0;
for(int i=0;i<tn;++i){
c[idx++]=C(tn-1,i);
if(tn&1){
c[idx]=c[idx-1];
}
else{
c[idx]=-c[idx-1];
}
++idx;
}
ll ans=0;
for(int i=0;i<n;++i){
ans=(ans+c[i]*a[i])%MOD;
}
return (ans+MOD)%MOD;
}
int main()
{
//freopen("/home/lu/code/r.txt","r",stdin);
int n;
initFact();
while(~scanf("%d",&n)){
for(int i=0;i<n;++i){
scanf("%lld",a+i);
}
if(n==1){
printf("%lld\n",a[0]);
continue;
}
if(n&1){
int flag=1;
for(int i=0;i<n-1;++i){
a[i]=a[i]+flag*a[i+1];
flag*=-1;
}
--n;
}
printf("%d\n",slove(n));
}
return 0;
}