Cod sursa(job #2700841)

Utilizator pielevladutPiele Vladut Stefan pielevladut Data 29 ianuarie 2021 01:02:35
Problema Hashuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <bits/stdc++.h>

#define MOD 1000000007

#define int long long

using namespace std;

ifstream fin("crescator.in");
ofstream fout("crescator.out");

int n;
int v[300300];
int factorial[300300];

void precalc()
{
    factorial[0] = 1;
    for(int i = 1; i <= 300000; i ++)
    {
        factorial[i] = factorial[i-1] * i;
        factorial[i] %= MOD;
    }
}

int lgput(int base, int exp)
{
    int ans = 1, aux = base;
    for(int i = 1; i <= exp; i *= 2)
    {
        if(i & exp)
        {
            ans = ans * aux;
            ans %= MOD;
        }
        aux = aux * aux;
        aux %= MOD;
    }
    return ans;
}

int combinari(int nn, int kk)
{
    int N = nn + kk - 1;
    int K = nn - 1  ;
    return (((factorial[N] * lgput(factorial[K], MOD - 2)) % MOD) * lgput(factorial[N-K], MOD - 2)) % MOD;
}

int32_t main()
{
    bool ok = false;
    int m;
    cin >> n;
    for(int i = 1; i <= n; i ++)
    {
        cin >> v[i];
        if(v[i] < 0)
            ok = true;
    }
    if(ok == true)
        return 0;
    precalc();
    int i = 1, first = 0, last = 0, ans = 1;
    while(i <= n)
    {
        while(v[i] > 0 && i <= n)
            i++;
        if(i > n)
            break;
        int poz = i;
        first = v[i-1];
        while(v[i] == 0)
            i++;
        last = v[i];
        int poz2 = i;
        ans *= combinari(last - first + 1, poz2 - poz);
        ans %= MOD;
    }
    cout << ans << '\n';
}