#include <bits/stdc++.h>
#include <bits/extc++.h> // gp_hash_table, pbds
using namespace __gnu_pbds;
#include<numeric>
using namespace std;
using ll = long long;
#define int ll
using ld = long double;
using vi = vector<int>;
#define pb push_back
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL);
using pll = pair<ll, ll>;
using pi = pair<int, int>;
#define f first
#define s second
#define mp make_pair
#define deb false
#define INF 1e18
#define mod1 1000000007
#define mod2 998244353
#define N 100001
#define logN 22
#define endl "\n"
#define hash1 10007
#define hash2 1009
#define rep(i, a, b) for (int i = a; i <= b; ++i)
typedef tree<pi, null_type, less<pi>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
int tc = 1, t = 1;
long long binpow(long long a, long long b, long long m) {
long long res = 1;
while (b > 0) {
if (b & 1)
res = (res * a) % m;
a = (a * a) % m;
b >>= 1;
}
return res % m;
}
void modplus(int &a, int b) {
b %= mod1;
a = (a + b) % mod1;
}
int dp[101][101][1001][3];
void solve() {
int n, l;
cin >> n >> l;
vi wow(n);
for (int i = 0; i < n; i++) {
cin >> wow[i];
}
sort(all(wow));
if (n == 1) {
cout << 1 << endl;
return;
} else if (n == 2) {
cout << 2 * ((wow[1] - wow[0]) <= l) << endl;
return;
}
dp[0][1][0][0] = 1;
dp[0][1][0][1] = 2;
for (int i = 0; i + 1 < n; i++) {
for (int j = 1; j <= n; j++) {
for (int k = 0; k <= l; k++) {
// 0 to 0
if (k + (2 * j * (wow[i + 1] - wow[i]) <= l)) {
modplus(dp[i + 1][j - 1][k + 2 * j * (wow[i + 1] - wow[i])][0], (j - 1) * dp[i][j][k][0]);
modplus(dp[i + 1][j + 1][k + 2 * j * (wow[i + 1] - wow[i])][0], (j + 1) * dp[i][j][k][0]);
modplus(dp[i + 1][j][k + 2 * j * (wow[i + 1] - wow[i])][0], 2 * j * dp[i][j][k][0]);
}
//1 to 1
if (k + ((2 * j - 1)* (wow[i + 1] - wow[i]) <= l)) {
modplus(dp[i + 1][j - 1][k + (2 * j - 1)* (wow[i + 1] - wow[i])][1], (j - 1) * dp[i][j][k][1]);
modplus(dp[i + 1][j + 1][k + (2 * j - 1)* (wow[i + 1] - wow[i])][1], j * dp[i][j][k][1]);
modplus(dp[i + 1][j][k + (2 * j - 1) * (wow[i + 1] - wow[i])][1], (2 * j - 1) * dp[i][j][k][1]);
}
//2 to 2
if (k + ((2 * j - 2) * (wow[i + 1] - wow[i]) <= l)) {
modplus(dp[i + 1][j - 1][k + (2 * j - 2)* (wow[i + 1] - wow[i])][1], (j - 1) * dp[i][j][k][2]);
modplus(dp[i + 1][j + 1][k + (2 * j - 2)* (wow[i + 1] - wow[i])][1], (j - 1) * dp[i][j][k][2]);
modplus(dp[i + 1][j][k + (2 * j - 2) * (wow[i + 1] - wow[i])][1], (2 * j - 2) * dp[i][j][k][2]);
}
//0 to 1 trans
if (k + (2 * j * (wow[i + 1] - wow[i]) <= l)) {
modplus(dp[i + 1][j][k + 2 * j * (wow[i + 1] - wow[i])][1], 2 * dp[i][j][k][0]);
modplus(dp[i + 1][j + 1][k + 2 * j * (wow[i + 1] - wow[i])][1], 2 * dp[i][j][k][0]);
}
//1 to 2 trans
if (k + ((2 * j - 1) * (wow[i + 1] - wow[i]) <= l)) {
modplus(dp[i + 1][j][k + (2 * j - 1) * (wow[i + 1] - wow[i])][2], dp[i][j][k][1]);
modplus(dp[i + 1][j + 1][k + (2 * j - 1) * (wow[i + 1] - wow[i])][2], dp[i][j][k][1]);
}
}
}
}
int ans = 0;
for (int i = 0; i <= l; i++) {
modplus(ans, dp[n-1][1][i][2]);
}
cout << ans << endl;
}
int32_t main() {
fast;
//cin >> t;
//preproces();
for (tc = 1; tc <= t; tc++) {
solve();
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |