Submission #902597

#TimeUsernameProblemLanguageResultExecution timeMemory
902597Spade1Skyscraper (JOI16_skyscraper)C++14
100 / 100
1742 ms38468 KiB
#include <bits/stdc++.h> #define ll long long #define pii pair<int, int> #define pll pair<ll ll> #define st first #define nd second #define pb push_back using namespace std; const int maxN = 1e2 + 2; const int maxL = 1e3 + 2; const int M = 1e9 + 7; ll dp[maxN][8*maxL][3], tmp[maxN][8*maxL][3], a[maxN]; void solve() { ll n, l; cin >> n >> l; if (n == 1) { cout << 1 << '\n'; return; } for (int i = 1; i <= n; ++i) cin >> a[i]; sort(a+1, a+n+1); tmp[0][7*l][0] = 1; for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) { for (int k = 0; k <= 8*l; ++k) { if (k+2*a[i] <= 8*l) { dp[j][k][0] = (dp[j][k][0] + j*tmp[j-1][k+2*a[i]][0]) % M; dp[j][k][1] = (dp[j][k][1] + (j-1)*tmp[j-1][k+2*a[i]][1]) % M; dp[j][k][2] = (dp[j][k][2] + (j-2)*tmp[j-1][k+2*a[i]][2]) % M; } if (k+a[i] <= 8*l) { dp[j][k][1] = (dp[j][k][1] + 2*tmp[j-1][k+a[i]][0]) % M; dp[j][k][2] = (dp[j][k][2] + tmp[j-1][k+a[i]][1]) % M; } dp[j][k][0] = (dp[j][k][0] + (2*j)*tmp[j][k][0]) % M; dp[j][k][1] = (dp[j][k][1] + (2*j-1)*tmp[j][k][1]) % M; dp[j][k][2] = (dp[j][k][2] + (2*j-2)*tmp[j][k][2]) % M; if (k-a[i] >= 0) { dp[j][k][1] = (dp[j][k][1] + 2*tmp[j][k-a[i]][0]) % M; dp[j][k][2] = (dp[j][k][2] + tmp[j][k-a[i]][1]) % M; } if (k-2*a[i] >= 0) { dp[j][k][0] = (dp[j][k][0] + j*tmp[j+1][k-2*a[i]][0]) % M; dp[j][k][1] = (dp[j][k][1] + j*tmp[j+1][k-2*a[i]][1]) % M; dp[j][k][2] = (dp[j][k][2] + j*tmp[j+1][k-2*a[i]][2]) % M; } } } for (int j = 0; j <= n; ++j) { for (int k = 0; k <= 8*l; ++k) { tmp[j][k][0] = dp[j][k][0]; tmp[j][k][1] = dp[j][k][1]; tmp[j][k][2] = dp[j][k][2]; dp[j][k][0] = dp[j][k][1] = dp[j][k][2] = 0; } } } ll ans = 0; for (int i = 7*l; i <= 8*l; ++i) { ans += tmp[1][i][2]; ans %= M; } cout << ans << '\n'; } int main() { ios_base::sync_with_stdio(0); cin.tie(NULL); int 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...