比赛 26暑假集训模拟赛1 评测结果 AAAAAAAAAT
题目名称 最终得分 90
用户昵称 RpUtl 运行时间 3.931 s
代码语言 C++ 内存使用 74.15 MiB
提交时间 2026-06-29 12:20:32
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N = 505;
int n, mod, dp[N][N][N], ans, c[N][N]; 
void add(int x, int y, int X, int Y, int v) {
    (c[x][y] += v) %= mod;
    (c[x][Y + 1] -= v) %= mod;
    (c[X + 1][y] -= v) %= mod;
    (c[X + 1][Y + 1] += v) %= mod;
    return;
}
int main(){
    freopen("great.in", "r", stdin);
    freopen("great.out", "w", stdout);
    cin >> n >> mod;
    dp[0][0][0] = 1;
    for (int i = 0; i <= n; i++) {
        for (int j = 0; j <= i; j++) {
            for (int k = 0; k <= i; k++) {
                if (!dp[i][j][k]) continue;
                (dp[i + 1][j][k] += dp[i][j][k]) %= mod;
                add(j + 1, k + 1, j + 1, j, dp[i][j][k]);
                add(j + 1, k, i, k, dp[i][j][k]);
            }
        }
        for (int j = 0 ; j <= n; j++) {
            for (int k = 0; k <= n; k++) {
                if (j) (c[j][k] += c[j - 1][k]) %= mod;
                if (k) (c[j][k] += c[j][k - 1]) %= mod;
                if (j && k) (c[j][k] -= c[j - 1][k - 1]) %=mod;
                (dp[i + 1][j][k] += c[j][k]) %= mod;
            }
        }
        for (int j = 0 ; j <= n; j++) {
            for (int k = 0; k <= n; k++) {
                c[j][k] = 0; 
            }
        }
    }
    for (int j = 0; j <= n; j++) {
        for (int k = 0; k <= n; k++) {
            (ans += dp[n][j][k]) %= mod;
        }
    }
    ans = (ans % mod + mod) % mod;
    cout << ans << '\n';
    return 0;
}