显示代码纯文本
#include<iostream>
using namespace std;
#define ll long long
const ll MAXN = 1e6 + 5;
const ll MOD = 1e9 + 7;
ll col[MAXN];
ll incol[MAXN];
ll n, a[MAXN];
ll qpow(ll a,ll b,ll m){
ll ans = 1;
a %= m;
while(b){
if(b & 1) ans = (ans * a) % m;
b >>= 1;
a = (a * a) % m;
}
return ans;
}
ll inv(ll x){
return qpow(x, MOD - 2, MOD);
}
ll C(ll a, ll b){
if(a < b || b < 0) return 0;
return (col[a] * incol[b] % MOD) * incol[a - b] % MOD;
}
int main(){
freopen("moorouteg.in","r",stdin);
freopen("moorouteg.out","w",stdout);
cin.tie(0) -> ios::sync_with_stdio(0);
cin >> n;
for(int i = 1;i <= n;i ++){
cin >> a[i];
a[i] /= 2;
}
col[0] = incol[0] = 1;
for(int i = 1;i < MAXN;i ++){
col[i] = col[i - 1] * i % MOD;
incol[i] = inv(col[i]);
}
ll ans = 1;
for(int i = 1;i < n;i ++){
if(a[i] > a[i + 1]) ans = ans * C(a[i], a[i + 1]) % MOD;
else ans = ans * C(a[i + 1] - 1, a[i] - 1) % MOD;
}
cout << ans << '\n';
return 0;
}