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;
typedef long long ll;
const int N = 1e2 + 5, MOD = 1e9 + 7;
int n,l,a[N];
int dp[N][N][2][2][N*10];
void add(int &x,int y){
    x += y;
    if(x >= MOD) x -= MOD;
}
void test(){
    cin >> n >> l;
    for(int i = 1;i <= n;i++) {
        cin >> a[i];
    }
    sort(a + 1,a + n + 1);
    if(n == 1) {
        cout << 1;
        return;
    }
    if(a[2] - a[1] + a[2] - a[1] <= l) dp[2][1][0][0][(a[2]-a[1])*2] = 1;
    if(a[2] - a[1] <= l) dp[2][1][0][1][a[2]-a[1]] = dp[2][1][1][0][a[2]-a[1]] = 1;
    a[n+1] = 10000;
    for(int i = 2;i <= n;i++){
        for(int j = 1;j <= i;j++){
            for(int s = 0;s < 2;s++){
                for(int t = 0;t < 2;t++){
                    for(int k = 0;k <= l;k++){
                        int d = dp[i][j][s][t][k];
                        ll val = (a[i+1]-a[i]);
                        {//new
                            if(k+val*((j+1)*2-s-t) <= l) add(dp[i+1][j+1][s][t][k+val*((j+1)*2-s-t)],d*1ll*(j+1-s-t)%MOD);
                            if(!s){
                                if(k+val*((j+1)*2-1-t) <=l)add(dp[i+1][j+1][1][t][k+val*((j+1)*2-1-t)],d);
                            }
                            if(!t){
                                if(k+val*((j+1)*2-1-s) <= l)add(dp[i+1][j+1][s][1][k+val*((j+1)*2-1-s)],d);
                            }
                        }
                        {//merge
                            if(k+val*((j-1)*2-s-t)<=l)add(dp[i+1][j-1][s][t][k+val*((j-1)*2-s-t)],d*1ll*(j-1)%MOD);
                        }
                        {//corner
                            if(k+val*(2*j-s-t) <= l) add(dp[i+1][j][s][t][k+val*(2*j-s-t)],d*1ll*(j*2-s-t)%MOD);
                            if(!s){
                                if(k+val*(2*j-1-t) <= l) add(dp[i+1][j][1][t][k+val*(2*j-1-t)],d);
                            }
                            if(!t){
                                if(k+val*(2*j-1-s) <= l) add(dp[i+1][j][s][1][k+val*(2*j-1-s)],d);
                            }
                        }
                    }
                }
            }
        }
    }
    int ans = 0;
    for(int i = 1;i <= l;i++){
        add(ans,dp[n + 1][1][1][1][i]);
    }
    cout << ans;
}
int main(){
    ios_base::sync_with_stdio(false);cin.tie(0);
    int T = 1;
//    cin >> T;
    while (T--){
        test();
    }
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |