제출 #1149874

#제출 시각아이디문제언어결과실행 시간메모리
1149874dragstSkyscraper (JOI16_skyscraper)C++20
15 / 100
1 ms840 KiB
#include <bits/stdc++.h> using namespace std; const long long inf=1e12, mod=1e9+7; long long a[105], dp[105][105][1005][3]; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); long long n, l, i, j, k, num, ans=0; cin >> n >> l; for (i=1; i<=n; i++) { cin >> a[i]; }; sort(a+1, a+n+1); num=a[2]-a[1]; if (num<=l) {dp[1][1][num][1]=2;}; if (num*2<=l) {dp[1][1][num*2][0]=1;}; for (i=1; i<n; i++) { if (i<n-1) {num=a[i+2]-a[i+1];} else {num=0;}; for (j=1; j<=i; j++) { for (k=0; k<=l; k++) { if (j>1 && k+num*(j*2-4)<=l) { if (i==n-1) { dp[i+1][j-1][k+num*(j*2-4)][2]+=dp[i][j][k][2]; dp[i+1][j-1][k+num*(j*2-4)][2]%=mod; } else { dp[i+1][j-1][k+num*(j*2-4)][2]+=((dp[i][j][k][2]*(j-2))%mod*(j-1))%mod; dp[i+1][j-1][k+num*(j*2-4)][2]%=mod; }; }; if (j>1&& k+num*(j*2-3)<=l) { dp[i+1][j-1][k+num*(j*2-3)][1]+=((dp[i][j][k][1]*(j-1))%mod*(j-1))%mod; dp[i+1][j-1][k+num*(j*2-3)][1]%=mod; }; if (k+num*(j*2-2)<=l) { if (j>1) { dp[i+1][j-1][k+num*(j*2-2)][0]+=((dp[i][j][k][0]*(j-1))%mod*j)%mod; dp[i+1][j-1][k+num*(j*2-2)][0]%=mod; }; dp[i+1][j][k+num*(j*2-2)][2]+=((dp[i][j][k][2]*2)%mod*(j-1))%mod; dp[i+1][j][k+num*(j*2-2)][2]%=mod; if (i==n-1) { dp[i+1][j][k+num*(j*2-2)][2]+=dp[i][j][k][1]; dp[i+1][j][k+num*(j*2-2)][2]%=mod; } else { dp[i+1][j][k+num*(j*2-2)][2]+=(dp[i][j][k][1]*(j-1))%mod; dp[i+1][j][k+num*(j*2-2)][2]%=mod; }; }; if (k+num*(j*2-1)<=l) { dp[i+1][j][k+num*(j*2-1)][1]+=((dp[i][j][k][0]*2)%mod*j)%mod; dp[i+1][j][k+num*(j*2-1)][1]%=mod; dp[i+1][j][k+num*(j*2-1)][1]+=(dp[i][j][k][1]*(2*j-1))%mod; dp[i+1][j][k+num*(j*2-1)][1]%=mod; }; if (k+num*j*2<=l) { dp[i+1][j][k+num*j*2][0]+=((dp[i][j][k][0]*2)%mod*j)%mod; dp[i+1][j][k+num*j*2][0]%=mod; dp[i+1][j+1][k+num*j*2][2]+=dp[i][j][k][1]%mod; dp[i+1][j+1][k+num*j*2][2]%=mod; dp[i+1][j+1][k+num*j*2][2]+=dp[i][j][k][2]; dp[i+1][j+1][k+num*j*2][2]%=mod; }; if (k+num*(j*2+1)<=l) { dp[i+1][j+1][k+num*(j*2+1)][1]+=(dp[i][j][k][0]*2)%mod; dp[i+1][j+1][k+num*(j*2+1)][1]%=mod; dp[i+1][j+1][k+num*(j*2+1)][1]+=dp[i][j][k][1]; dp[i+1][j+1][k+num*(j*2+1)][1]%=mod; }; if (k+num*(j*2+2)<=l) { dp[i+1][j+1][k+num*(j*2+2)][0]+=dp[i][j][k][0]; dp[i+1][j+1][k+num*(j*2+2)][0]%=mod; }; }; }; }; for (i=0; i<=l; i++) {ans+=dp[n][1][i][2]; ans%=mod;}; cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...