Submission #488708

#TimeUsernameProblemLanguageResultExecution timeMemory
488708andreiomdSkyscraper (JOI16_skyscraper)C++11
100 / 100
288 ms3624 KiB
#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

using ll = long long;

const int NMAX = 1e2 + 3, KMAX = 1e3 + 3;
const int MOD = 1e9 + 7;

int N, K, A[NMAX];

int New[NMAX][KMAX][2][2], Old[NMAX][KMAX][2][2];

static inline void Read ()
{
    ios_base :: sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> N >> K;

    for(int i = 1; i <= N; ++i)
        cin >> A[i];

    return;
}

static inline void Initialize ()
{
    New[0][0][1][1] = New[0][0][0][1] = New[0][0][1][0] = New[0][0][0][0] = 1;

    return;
}

void Add (int &x, int y, int z)
{
    x = (1ll * x + 1LL * y * z) % (1ll * MOD);

    return;
}

static inline void Find_Answer ()
{
    int ans = 0;
    for(int i = 0; i <= K; ++i)
        Add(ans, 1, New[0][i][0][0]);

    cout << ans << '\n';

    return;
}

int main()
{
    Read();

    sort(A + 1, A + N + 1);
    for(int i = 1; i <= N; ++i)
        A[i] = A[i+1] - A[i];

    Initialize();

    for(int i = 1; i < N; ++i)
    {
        memcpy(Old, New, sizeof(New));
        memset(New, 0, sizeof(New));

        for(int j = 0; j <= N; ++j)
            for(int k = 0; k <= K; ++k)
                for(int F = 0; F < 2; ++F)
                    for(int S = 0; S < 2; ++S)
                    {
                        int new_k = k + A[i] * ((j << 1) + F + S);

                        if(new_k > K)
                            continue;

                        Add(New[j + 1][new_k][F][S], j, Old[j][k][F][S]);
                        Add(New[j][new_k][F][S], (j << 1), Old[j][k][F][S]);

                        if(j > 0)
                            Add(New[j - 1][new_k][F][S], j, Old[j][k][F][S]);

                        if(F > 0)
                        {
                            Add(New[j + 1][new_k][1][S], 1, Old[j][k][F][S]);
                            Add(New[j + 1][new_k][0][S], 1, Old[j][k][F][S]);

                            Add(New[j][new_k][1][S], 1, Old[j][k][F][S]);
                            Add(New[j][new_k][0][S], 1, Old[j][k][F][S]);
                        }

                        if(S > 0)
                        {
                            Add(New[j + 1][new_k][F][1], 1, Old[j][k][F][S]);
                            Add(New[j + 1][new_k][F][0], 1, Old[j][k][F][S]);

                            Add(New[j][new_k][F][1], 1, Old[j][k][F][S]);
                            Add(New[j][new_k][F][0], 1, Old[j][k][F][S]);
                        }
                    }
    }

    Find_Answer();

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...