加了滚动数组就 WA 了
查看原帖
加了滚动数组就 WA 了
932039
lzy20091001楼主2024/7/26 11:09

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

2024/7/26 11:09
加载中...