题意
题解
好神奇的思路……
这题如果都是加法的话就很简单了,直接组合数算每个数的贡献即可。
如果这样正负交替出现怎么办呢,通过观察,可以发现一些东西。
丢官方图:
当
n
为偶数的时候,可以分别看奇数项和偶数项(上图蓝色和黄色),可以发现它们上下的关系和都是加法的情况一样!
最后只需要把奇,偶的贡献和相加或相减即可。
如果
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long LL;
const LL maxn=200005, MOD=1000000007;
int n,a[maxn],fac[maxn],pw[maxn],ans;
int Pow(int a,int b){
LL res=1;
for(LL w=a;b;b>>=1,w=w*w%MOD) if(b&1) res=(res*w)%MOD;
return res;
}
int C(int n,int m){ return (LL)fac[n]*pw[m]%MOD*pw[n-m]%MOD; }
int main(){
//freopen("B.in","r",stdin);
//freopen("B.out","w",stdout);
fac[0]=pw[0]=1; for(int i=1;i<=200001;i++) fac[i]=(LL)fac[i-1]*i%MOD, pw[i]=Pow(fac[i],MOD-2);
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
if(n==1){ printf("%d\n",a[1]); return 0; }
if(n&1){
for(int i=1;i<=n-1;i++){
if(i&1) a[i]=(a[i]+a[i+1])%MOD;
else a[i]=(a[i]+MOD-a[i+1])%MOD;
}
n--;
}
int t1=0,t2=0;
for(int i=1;i<=n/2;i++){
LL _c=C(n/2-1,i-1);
t1=(t1+_c*a[2*i-1]%MOD)%MOD; t2=(t2+_c*a[2*i]%MOD)%MOD;
}
if(n%4==0) ans=(t1+MOD-t2)%MOD;
else ans=(t1+t2)%MOD;
printf("%d\n",ans);
return 0;
}