Submission #1281387

#TimeUsernameProblemLanguageResultExecution timeMemory
1281387ridarfxSkyscraper (JOI16_skyscraper)C++20
100 / 100
85 ms77336 KiB
#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
const long long INF = 1e18;
const long long mxN = 105;
const long long MOD = 1e9+7;
long long dp[mxN][mxN][1005][3];
void solve(){
	long long n,l;
	cin >> n >> l;
	vector<long long> a(n+2);
	for(int i=1; i<=n; i++){
		cin >> a[i];
	}
	if(n==1){
		cout << 1 << endl;
		return;
	}
	a[n+1]=10000;
	sort(a.begin(),a.end());
	dp[0][0][0][0]=1;
	for(int i=1; i<=n; i++){
		for(int j=1; j<=i; j++){
			for(int k=0; k<=l; k++){
				for(int m=0; m<=2; m++){
					long long delta = (2*j-m)*(a[i+1]-a[i]);
					if(delta>k) continue;
				   	dp[i][j][k][m]+=dp[i-1][j-1][k-delta][m];
					if(m){
						dp[i][j][k][m]+=(3-m)*dp[i-1][j-1][k-delta][m-1];
					}
					dp[i][j][k][m]+=(2*j-m)*dp[i-1][j][k-delta][m];
					if(m==1){
						dp[i][j][k][m]+=2*j*dp[i-1][j][k-delta][m-1];
					}
					if(m==2){
						if(i==n){
							dp[i][j][k][m]+=dp[i-1][j][k-delta][m-1];
						}
						else{
							dp[i][j][k][m]+=(j-1)*dp[i-1][j][k-delta][m-1];
						}
					}
					if(m==2){
						if(i==n){
							dp[i][j][k][m]+=dp[i-1][j+1][k-delta][m];
						}
						else{
							dp[i][j][k][m]+=j*(j-1)*dp[i-1][j+1][k-delta][m];
						}
					}
					else if(m==1){
						dp[i][j][k][m]+=j*j*dp[i-1][j+1][k-delta][m];
					}
					else{
						dp[i][j][k][m]+=j*(j+1)*dp[i-1][j+1][k-delta][m];
					}
					dp[i][j][k][m]%=MOD;	
				}
			}
		}
	}
	long long ans = 0;
	for(int i=0; i<=l; i++){
		ans+=dp[n][1][i][2];
	}
	cout << ans%MOD << endl;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    long long t=1; //cin >> t;
    while(t--){
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...