#include <bits/stdc++.h>
#define ll long long
#define task ""
using namespace std;
const int maxn = 102, maxa = 1002, mod = 1e9 + 7, inf = 1e9;
ll n, L, d, a[maxn], dp[maxn][maxn][maxa][3], res = 0;
void add (ll &a, ll b)
{
a += b;
if (a >= mod) a -= mod;
}
int main()
{
//freopen(task".INP", "r", stdin);
//freopen(task".OUT", "w", stdout);
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> L;
for (int i = 1; i <= n; i++) cin >> a[i];
a[n + 1] = inf;
sort(a + 1, a + n + 1);
//idea : initially fill the empty spaces with a[1] and raise it as we go
if (a[2] - a[1] <= L) dp[1][1][a[2] - a[1]][1] = 2; //pos 1 or n
if (2*(a[2] - a[1]) <= L) dp[1][1][2*(a[2] - a[1])][0] = 1; //pos 2 -> n - 1
for (int i = 2; i <= n; i++)
{
d = a[i + 1] - a[i];
for (int j = 1; j < i; j++)
{
for (int k = 0; k <= L; k++)
{
for (int l = 0; l < 3; l++)
{
ll v = dp[i - 1][j][k][l];
if (v == 0) continue;
if (l < 2)
{
if (k + d*(2*j - l + 1) <= L)
{
add(dp[i][j + 1][k + d*(2*j - l + 1)][l + 1], v*(2 - l)%mod);
} //new connected component
if (k + d*(2*j - l - 1) <= L)
{
if (i == n)
{
add(dp[i][j][k + d*(2*j - l - 1)][l + 1], v*(2 - l)*j%mod);
}
else if (l == 0 || j > 1)
{
add(dp[i][j][k + d*(2*j - l - 1)][l + 1], v*(2 - l)*(j - l)%mod);
}
} //connect to old components
} // pos 1 or n
if (k + d*(2*j - l + 2) <= L)
{
add(dp[i][j + 1][k + d*(2*j - l + 2)][l], v);
} //new connected component
if (k + d*(2*j - l) <= L)
{
add(dp[i][j][k + d*(2*j - l)][l], v*(2*j - l)%mod);
} //connect to old components
if (k + d*(2*j - l - 2) <= L && j > 1 && (i == n || j > 2 || l < 2))
{
if (l == 0)
{
add(dp[i][j - 1][k + d*(2*j - l - 2)][l], v*j*(j - 1)%mod);
}
if (l == 1)
{
add(dp[i][j - 1][k + d*(2*j - l - 2)][l], v*(j - 1)*(j - 1)%mod);
}
if (l == 2)
{
if (i == n)
{
add(dp[i][j - 1][k + d*(2*j - l - 2)][l], v);
}
else
{
add(dp[i][j - 1][k + d*(2*j - l - 2)][l], v*(j - 2)*(j - 1)%mod);
}
}
} //merge 2 components
//pos 2 -> n - 1
}
}
}
}
for (int i = 0; i <= L; i++) add(res, dp[n][1][i][2]);
cout << res;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |