This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
constexpr int MAXN = 105;
constexpr int MAXL = 1005;
constexpr int MAXINT = 1073741823;
constexpr int MOD = 1000000007;
int a[MAXN];
long long int dp[MAXN][MAXN][MAXL][3];
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	long long int n, l, new_sum, answer = 0;
	cin >> n >> l;
	if (n == 1) {
		cout << 1;
		return 0;
	}
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	sort(a + 1, a + n + 1);
	a[n + 1] = MAXINT;
	dp[0][0][0][0] = 1;
	for (int i = 1; i <= n; i++)
		for (int components = 1; components <= i; components++)
			for (int sum = 0; sum <= l; sum++)
				for (int endpoints = 0; endpoints <= 2; endpoints++) {
					new_sum = (2 * components - endpoints) * (a[i + 1] - a[i]);
					if (new_sum > sum || i + components + 1 - endpoints > n)
						continue;
					new_sum = sum - new_sum;
					dp[i][components][sum][endpoints] += dp[i - 1][components - 1][new_sum][endpoints];
					if (endpoints > 0)
						dp[i][components][sum][endpoints] += (3 - endpoints) * dp[i - 1][components - 1][new_sum][endpoints - 1];
					dp[i][components][sum][endpoints] += (2 * components - endpoints) * dp[i - 1][components][new_sum][endpoints];
					if (endpoints == 1)
						dp[i][components][sum][endpoints] += 2 * components * dp[i - 1][components][new_sum][0];
					else if (endpoints == 2 && i == n)
						dp[i][components][sum][endpoints] += dp[i - 1][components][new_sum][1];
					else if (endpoints == 2 && components > 1)
						dp[i][components][sum][endpoints] += (components - 1) * dp[i - 1][components][new_sum][1];
					if (endpoints == 2 && i == n)
						dp[i][components][sum][endpoints] += dp[i - 1][components + 1][new_sum][2];
					else if (endpoints == 2)
						dp[i][components][sum][endpoints] += components * (components - 1) * dp[i - 1][components + 1][new_sum][2];
					else if (endpoints == 1)
						dp[i][components][sum][endpoints] += components * components * dp[i - 1][components + 1][new_sum][1];
					else
						dp[i][components][sum][endpoints] += components * (components + 1) * dp[i - 1][components + 1][new_sum][0];
					dp[i][components][sum][endpoints] %= MOD;
				}
	for (int i = 0; i <= l; i++)
		answer = (answer + dp[n][1][i][2]) % MOD;
	cout << answer;
	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... |