Cod sursa(job #3247581)

Utilizator Sasha_12454Eric Paturan Sasha_12454 Data 8 octombrie 2024 15:28:49
Problema Potrivirea sirurilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <bits/stdc++.h>

const std :: string FILENAME = "";

std :: ifstream f (FILENAME + ".in");

std :: ofstream g (FILENAME + ".out");

const long long NMAX = 2e3 + 5;

const long long mod = 1e9 + 7;

long long n;

long long h;

long long v[NMAX];

long long dp[NMAX][NMAX];

int main()
{

    std :: ios_base :: sync_with_stdio(false);

    std :: cin.tie(NULL);

    std :: cin >> n >> h;

    for(long long i = 1; i <= n; i ++)
    {
        std :: cin >> v[i];
    }

    dp[1][0] = (v[1] == h || v[1] + 1 == h ? 1 : 0);

    dp[1][1] = (v[1] + 1 == h ? 1 : 0);

    for (long long i = 2; i <= n + 1; i ++)
    {
        for (long long j = std :: max(0ll,h - v[i]- 1); j <= std :: min(h - v[i],i) ; j ++)
        {
            if (v[i] + j == h)
            {
                dp[i][j] += dp[i - 1][j];

                dp[i][j] %= mod;

                if (j > 0)
                {
                    dp[i][j] += dp[i - 1][j - 1];

                    dp[i][j] %= mod;
                }
            }
            if (j + v[i] + 1 == h)
            {
                dp[i][j] += dp[i - 1][j];

                dp[i][j] = (1ll * dp[i][j] + dp[i - 1][j] * j) % mod;

                dp[i][j] = (1ll * dp[i][j] + dp[i - 1][j + 1] * (j + 1)) % mod;
            }
        }
    }

    std :: cout << dp[n][0];

    return 0;
}