| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1281386 | ridarfx | Skyscraper (JOI16_skyscraper) | C++20 | 0 ms | 0 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 0;
}
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();
}
}
