题解:P10027 「HCOI-R1」梦境世界
saixingzhe · · 题解
题意
求二元组序列
-
- 对于
A 的每相邻两个元素A_i(x_0, y_0), A_{i+1}(x_1, y_1) ,要么: -
并且:所有满足第三步的
求合法
显然根据方格取数的方法,
- Step 2:计算
h
枚举上一个在这个点出去的
- Step 3:计算
f
枚举在这个点往外撤销了多少步,则
所有不合法状态:
然后求个和就结束了。空间复杂度
代码
#include <bits/stdc++.h>
#define MAXN 105
bool var[MAXN][MAXN];
#define MAXK 101
int f[MAXN][MAXN][MAXK], g[MAXN][MAXN][MAXK], h[MAXN][MAXN][MAXK];
int N, M, K, P, S;
inline void add(int& a, int b) { (a += b) >= P && (a -= P); }
inline int sum(int a, int b) { return (a += b) < P ? a : a - P; }
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr), std::cout.tie(nullptr);
std::cin >> N >> M >> K >> P >> S;
for (int i = 1, x, y; i <= S; ++i)
std::cin >> x >> y, var[x][y] = true;
for (int i = N; i; --i) for (int j = M; j; --j) {
if (i == N && j == M) {
if (var[i][j]) return std::cout << 0, 0;
f[i][j][0] = g[i][j][0] = h[i][j][0] = 1;
continue;
}
if (var[i][j]) continue;
h[i][j][0] = g[i][j][0] = 1;
f[i][j][0] = sum(f[i + 1][j][0], f[i][j + 1][0]);
for (int k = 1; k <= K; ++k) {
g[i][j][k] = sum(h[i + 1][j][k - 1], h[i][j + 1][k - 1]);
for (int l = 1; l <= k; ++l)
add(h[i][j][k], 1ll * h[i][j][k - l] * g[i][j][l] % P);
for (int l = 0; l <= k; ++l)
add(f[i][j][k], 1ll * h[i][j][l] * (f[i + 1][j][k - l] + f[i][j + 1][k - l]) % P);
}
}
int ans = 0;
for (int k = 0; k <= K; ++k) add(ans, f[1][1][k]);
return std::cout << ans, 0;
}