Submission #1254112

#TimeUsernameProblemLanguageResultExecution timeMemory
1254112tvgkSkyscraper (JOI16_skyscraper)C++20
100 / 100
240 ms161092 KiB
#include<bits/stdc++.h>
using namespace std;
#define task "a"
#define se second
#define fi first
#define ll long long
#define ii pair<ll, ll>
const long mxN = 1e2 + 7, MOD = 1e9 + 7, mxX = 1e3 + 7;

int n, mx, a[mxN];
ll dp[mxN][mxN][mxX][4];

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    //freopen(task".INP", "r", stdin);
    //freopen(task".OUT", "w", stdout);

    cin >> n >> mx;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    sort(a + 1, a + n + 1);

    if (n == 1)
    {
        cout << 1;
        return 0;
    }

    a[n + 1] = a[n];
    dp[0][2][0][2] = 1;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1 + (i != n); j <= n; j++)
        {
            for (int b = 0; b <= 2; b++)
            {
                ll cost = (2 * j - 2 - b) * (a[i + 1] - a[i]);
                for (int k = cost; k <= mx; k++)
                {
                    //tao thanh phan lien thong moi
                    dp[i][j][k][b] = (dp[i][j][k][b] + dp[i - 1][j - 1][k - cost][b]) % MOD;

                    //noi bien
                    dp[i][j][k][b] = (dp[i][j][k][b] + (b + 1) * dp[i - 1][j][k - cost][b + 1]) % MOD;

                    //noi lien thong khac
                    dp[i][j][k][b] = (dp[i][j][k][b] + (2 * j - 2 - b) * dp[i - 1][j][k - cost][b]) % MOD;

                    //noi 2 tplt tu do
                    ll num = j - 1;
                    dp[i][j][k][b] = (dp[i][j][k][b] + num * (num - 1) * dp[i - 1][j + 1][k - cost][b]) % MOD;

                    //noi bien va tplt
                    dp[i][j][k][b] = (dp[i][j][k][b] + 1LL * (j - 1) * (b + 1) * dp[i - 1][j + 1][k - cost][b + 1]) % MOD;

                    //noi tplt o bien va tplt tu do
                    dp[i][j][k][b] = (dp[i][j][k][b] + 1LL * (j - 1) * (2 - b) * dp[i - 1][j + 1][k - cost][b]) % MOD;

                    //vi tri cuoi cung
                    if (i == n)
                        dp[i][j][k][b] = (dp[i][j][k][b] + dp[i - 1][j + 1][k - cost][b] + dp[i - 1][j + 1][k - cost][b + 1]) % MOD;
                }
            }
        }
    }

    ll ans = 0;
    for (int i = 0; i <= mx; i++)
        ans = (ans + dp[n][1][i][0]) % MOD;
    cout << ans;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...