AC 代码:
#include <iostream>
const int MOD = 9999973;
int f[105][105][105];
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
int n, m, ans = 0;
std::cin >> n >> m;
f[0][0][0] = 1;
for (int i = 1; i <= n; i++)
for (int j = 0; j <= m; j++)
for (int k = 0; k <= m; k++)
{
// 不放
(f[i][j][k] += f[i - 1][j][k]) %= MOD;
// 放一颗
if (j > 0) // 放在空的列上
(f[i][j][k] += f[i - 1][j - 1][k] * (m - (j - 1) - k)) %= MOD;
if (k > 0) // 放在一颗棋子的列上
(f[i][j][k] += f[i - 1][j + 1][k - 1] * (j + 1)) %= MOD;
// 放两颗
if (j > 1) // 都放在空的列上
(f[i][j][k] += 1LL * f[i - 1][j - 2][k] * (m - (j - 2) - k) * (m - (j - 1) - k) / 2 % MOD) %= MOD;
if (j > 0 && k > 0) // 一颗放在空的列上,另一颗放在一颗棋子的列上
(f[i][j][k] += 1LL * f[i - 1][j][k - 1] * j * (m - j - (k - 1)) % MOD) %= MOD;
if (k > 1) // 都放在一颗棋子的列上
(f[i][j][k] += 1LL * f[i - 1][j + 2][k - 2] * (j + 2) * (j + 1) / 2 % MOD) %= MOD;
}
for (int i = 0; i <= m; i++)
for (int j = 0; j <= m; j++)
(ans += f[n][i][j]) %= MOD;
std::cout << ans << "\n";
return 0;
}
滚动数组代码:
#include <iostream>
const int MOD = 9999973;
int f[2][105][105];
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
int n, m, ans = 0;
std::cin >> n >> m;
f[0][0][0] = 1;
for (int i = 1; i <= n; i++)
for (int j = 0; j <= m; j++)
for (int k = 0; k <= m; k++)
{
// 不放
(f[i & 1][j][k] += f[(i - 1) & 1][j][k]) %= MOD;
// 放一颗
if (j > 0) // 放在空的列上
(f[i & 1][j][k] += f[(i - 1) & 1][j - 1][k] * (m - (j - 1) - k)) %= MOD;
if (k > 0) // 放在一颗棋子的列上
(f[i & 1][j][k] += f[(i - 1) & 1][j + 1][k - 1] * (j + 1)) %= MOD;
// 放两颗
if (j > 1) // 都放在空的列上
(f[i & 1][j][k] += 1LL * f[(i - 1) & 1][j - 2][k] * (m - (j - 2) - k) * (m - (j - 1) - k) / 2 % MOD) %= MOD;
if (j > 0 && k > 0) // 一颗放在空的列上,另一颗放在一颗棋子的列上
(f[i & 1][j][k] += 1LL * f[(i - 1) & 1][j][k - 1] * j * (m - j - (k - 1)) % MOD) %= MOD;
if (k > 1) // 都放在一颗棋子的列上
(f[i & 1][j][k] += 1LL * f[(i - 1) & 1][j + 2][k - 2] * (j + 2) * (j + 1) / 2 % MOD) %= MOD;
}
for (int i = 0; i <= m; i++)
for (int j = 0; j <= m; j++)
(ans += f[n & 1][i][j]) %= MOD;
std::cout << ans << "\n";
return 0;
}
是哪里改错了吗 QwQ