题意:交叉的加减类似杨辉三角,问最后一个数是什么
思路:
观察图,对于n是偶数,倒数第二行的数有关系,12 34 56的系数一样,分别是C(n/2-1,(i-1)/2) 别问我是怎么知道的,逃)。最后一个加减和n%4的值有关。
数比较大,用逆元求组合数
// 网上看到很多人写奇偶项满足二项式定理,因此可以求coe。。 不是很明白这个解释
#include<bits/stdc++.h>
#define PI acos(-1.0)
using namespace std;
typedef long long ll;
const int N=2e5+5;
const int MOD=1e9+7;
const int INF=0x3f3f3f3f;
ll a[N];
int F[N], Finv[N], inv[N];//F是阶乘,Finv是逆元的阶乘
void init(){
inv[1] = 1;
for(int i = 2; i < N; i ++){
inv[i] = (MOD - MOD / i) * 1ll * inv[MOD % i] % MOD;
}
F[0] = Finv[0] = 1;
for(int i = 1; i < N; i ++){
F[i] = F[i-1] * 1ll * i % MOD;
Finv[i] = Finv[i-1] * 1ll * inv[i] % MOD;
}
}
int comb(int n, int m){//comb(n, m)就是C(n, m)
if(m < 0 || m > n) return 0;
return F[n] * 1ll * Finv[n - m] % MOD * Finv[m] % MOD;
}
int main(void){
init();
int n;
cin >>n;
for(int i=1;i<=n;++i) scanf("%lld",&a[i]);
if(n==1){
cout <<a[1]%MOD<<endl;
return 0;
}
if(n==2){
cout << (a[1]+a[2])%MOD<<endl;
return 0;
}
if(n&1){
int flag=1;
for(int i=1;i<=n-1;i++){
a[i]=a[i]+flag*a[i+1];
flag=-flag;
}
--n;
}
// for(auto t:a) cout <<t<<" ";
int flag;
if(n%4==0) flag=-1;
else flag=1;
ll sum=0;
for(int i=1;i<=n;i+=2){
int coe=comb(n/2-1,(i-1)/2);
sum+= (a[i]+flag*a[i+1]) % MOD *coe %MOD;
sum=((sum%MOD)+MOD)%MOD;
}
cout <<sum <<endl;
return 0;
}