diff options
Diffstat (limited to '20.5/dec')
-rw-r--r-- | 20.5/dec/plat/sleeping.cpp | 47 | ||||
-rw-r--r-- | 20.5/dec/plat/spaceship.cpp | 49 |
2 files changed, 96 insertions, 0 deletions
diff --git a/20.5/dec/plat/sleeping.cpp b/20.5/dec/plat/sleeping.cpp new file mode 100644 index 0000000..a7ad9f5 --- /dev/null +++ b/20.5/dec/plat/sleeping.cpp @@ -0,0 +1,47 @@ +#include <bits/stdc++.h> +#define f first +#define s second +using namespace std; +using ll = long long; +using ii = pair<int, int>; +const int MX = 3005, MOD = 1e9+7; + + +ll s[MX], t[MX], DP[2][MX][2]; + + +int main() { + if (fopen("in", "r")) freopen("in", "r", stdin), freopen("out", "w", stdout); + ios_base::sync_with_stdio(0), cin.tie(0); + + int N; cin >> N; + for (int i = 0; i < N; ++i) cin >> s[i]; + for (int i = 0; i < N; ++i) cin >> t[i]; + + vector<ii> vc; + for (int i = 0; i < N; ++i) vc.emplace_back(s[i], 0); + for (int i = 0; i < N; ++i) vc.emplace_back(t[i], 1); + sort(begin(vc), end(vc)); + + DP[0][0][0] = 1; + for (int i = 0; i < 2*N; ++i) { + if (vc[i].s == 0) { + for (int j = 0; j <= N; ++j) { + (DP[1][j][1] += DP[0][j][0]) %= MOD; + (DP[1][j+1][0] += DP[0][j][0]) %= MOD; + (DP[1][j][1] += DP[0][j][1]) %= MOD; + (DP[1][j+1][1] += DP[0][j][1]) %= MOD; + } + } + else { + for (int j = 0; j <= N; ++j) { + (DP[1][j][0] += DP[0][j][0]) %= MOD; + if (j) (DP[1][j-1][0] += j*DP[0][j][0]) %= MOD; + if (j) (DP[1][j-1][1] += j*DP[0][j][1]) %= MOD; + } + } + memcpy(DP[0], DP[1], sizeof DP[1]); + memset(DP[1], 0, sizeof DP[1]); + } + cout << (DP[0][0][0]+DP[0][0][1])%MOD; +} diff --git a/20.5/dec/plat/spaceship.cpp b/20.5/dec/plat/spaceship.cpp new file mode 100644 index 0000000..d8d7849 --- /dev/null +++ b/20.5/dec/plat/spaceship.cpp @@ -0,0 +1,49 @@ +#include <bits/stdc++.h> +#define f first +#define s second +using namespace std; +using ll = long long; +using ii = pair<int, int>; +constexpr int MX = 65, MOD = 1e9+7; + +ll bs[MX], s[MX], bt[MX], t[MX], L[2*MX], R[2*MX], G[MX][MX], DP[MX][2*MX][2*MX]; + +int main() { + if (fopen("in", "r")) freopen("in", "r", stdin), freopen("out", "w", stdout); + ios_base::sync_with_stdio(0), cin.tie(0); + + int N, K, Q; cin >> N >> K >> Q; + for (int i = 0; i < N; ++i) { + string s; cin >> s; + for (int j = 0; j < N; ++j) G[i][j] = s[j] == '1'; + } + for (int i = 0; i < Q; ++i) + cin >> bs[i] >> s[i] >> bt[i] >> t[i], --bs[i], --s[i], --bt[i], --t[i]; + + for (int i = 0; i < K; ++i) { + for (int j = 0; j < N; ++j) { + for (int k = 0; k < N+Q; ++k) L[k] = k == j; + for (int k = 0; k < Q; ++k) + if (i == bs[k] && j == s[k]) L[N+k] = 1; + + for (int k = 0; k < N+Q; ++k) + for (int l = 0; l < N; ++l) + if (i && G[l][j]) (L[k] += DP[i-1][k][l]) %= MOD; + + for (int k = 0; k < N+Q; ++k) R[k] = k == j; + for (int k = 0; k < Q; ++k) + if (i == bt[k] && j == t[k]) R[N+k] = 1; + + for (int k = 0; k < N+Q; ++k) + for (int l = 0; l < N; ++l) + if (i && G[j][l]) (R[k] += DP[i-1][l][k]) %= MOD; + + for (int k = 0; k < N+Q; ++k) + for (int l = 0; l < N+Q; ++l) + (DP[i][k][l] += L[k]*R[l]) %= MOD; + } + memcpy(DP[i+1], DP[i], sizeof DP[i]); + } + + for (int i = 0; i < Q; ++i) cout << DP[K][N+i][N+i] << '\n'; +} |