Submission #515976

#TimeUsernameProblemLanguageResultExecution timeMemory
515976amunduzbaevSkyscraper (JOI16_skyscraper)C++14
100 / 100
68 ms23876 KiB
#include "bits/stdc++.h"
using namespace std;

#define ar array
#define int long long

const int mod = 1e9 + 7;

const int N = 105;
int dp[N][N][N * 10][3];
int a[N];

signed main(){
	ios::sync_with_stdio(0); cin.tie(0);
	
	int n, l; cin>>n>>l;
	for(int i=0;i<n;i++) cin>>a[i];
	sort(a, a+n);
	a[n] = N * 10;
	if(n == 1){
		cout<<1<<"\n";
		return 0;
	}
	
	dp[1][1][(a[1] - a[0]) * 2][0] = 1;
	dp[1][1][a[1] - a[0]][1] = 2;
	
	for(int i=1;i<n;i++){
		int dif = a[i+1] - a[i];
		for(int j=1;j<=n;j++){
			for(int c=0;c<=l;c++){
				for(int z=0;z<3;z++){
					if(!dp[i][j][c][z]) continue;
					
					if(z < 2 && c + dif * (2 * j - z - 1) <= l){
						if(i == n - 1){
							dp[i + 1][j][c + dif * (2 * j - z - 1)][z + 1] = 
							(dp[i + 1][j][c + dif * (2 * j - z - 1)][z + 1] + dp[i][j][c][z] * (2 - z)) % mod;
						} else if((z == 1 && j > 1) || z == 0){
							dp[i + 1][j][c + dif * (2 * j - z - 1)][z + 1] = 
							(dp[i + 1][j][c + dif * (2 * j - z - 1)][z + 1] + dp[i][j][c][z] * (j - z) * (2 - z)) % mod;
						} 
						
						if(c + dif * (2 * j - z + 1) <= l){
							dp[i + 1][j + 1][c + dif * (2 * j - z + 1)][z + 1] = 
							(dp[i + 1][j + 1][c + dif * (2 * j - z + 1)][z + 1] + dp[i][j][c][z] * (2 - z)) % mod;
						}
					}
					
					// make new component
					if(c + dif * (2 * j - z + 2) <= l){
						dp[i + 1][j + 1][c + dif * (2 * j - z + 2)][z] = 
						(dp[i + 1][j + 1][c + dif * (2 * j - z + 2)][z] + dp[i][j][c][z]) % mod;
					}
					
					// add to some component
					if(c + dif * (2 * j - z) <= l){
						dp[i + 1][j][c + dif * (2 * j - z)][z] = 
						(dp[i + 1][j][c + dif * (2 * j - z)][z] + dp[i][j][c][z] * (2 * j - z)) % mod;
					}
					
					if(c + dif * (2 * j - z - 2) <= l && j >= 2 && (z < 2 || i == n - 1 || j > 2)){
						if(z == 0){
							dp[i + 1][j - 1][c + dif * (2 * j - z - 2)][z] = 
							(dp[i + 1][j - 1][c + dif * (2 * j - z - 2)][z] + dp[i][j][c][z] * j * (j - 1)) % mod;
						}
						
						if(z == 1){
							dp[i + 1][j - 1][c + dif * (2 * j - z - 2)][z] = 
							(dp[i + 1][j - 1][c + dif * (2 * j - z - 2)][z] + dp[i][j][c][z] * (j - 1) * (j - 1)) % mod;
						}
						
						if(z == 2){
							dp[i + 1][j - 1][c + dif * (2 * j - z - 2)][z] = 
							(dp[i + 1][j - 1][c + dif * (2 * j - z - 2)][z] + dp[i][j][c][z] * max(1ll, (j - 2) * (j - 1))) % mod;
						}
					}
				}
			}
		}
	}
	
	int res = 0;
	for(int i=0;i<=l;i++){
		res = (res + dp[n][1][i][2]) % mod;
	}
	
	cout<<res<<"\n";
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...