比赛 26暑假集训模拟赛1 评测结果 AAAAAAAAAA
题目名称 最终得分 100
用户昵称 运行时间 0.202 s
代码语言 C++ 内存使用 4.38 MiB
提交时间 2026-06-29 10:17:46
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;

const int N=510;

int n,mod;
int dp[N][N],sum1[N][N],sum2[N][N];

inline int read(){
    int t=0,f=1;
    register char c=getchar();
    while(c<'0'||c>'9') f=(c=='-')?(-1):(f),c=getchar();
    while(c>='0'&&c<='9') t=(t<<3)+(t<<1)+(c^48),c=getchar();
    return t*f;
}

void add(int &x,int y){x=x+y>mod?x+y-mod:x+y;}

/*
    别回来 别回来
    我将终究顺流入大海 顺流入大海
    海不问我从何处来 
*/ 

signed main(){
    freopen("great.in","r",stdin);
    freopen("great.out","w",stdout);
    n=read(),mod=read();
    dp[0][0]=sum1[0][0]=sum2[0][0]=1;
    for(int i=2;i<=n;i++){
        for(int j=0;j<=i-1;j++){
            for(int k=0;k<j;k++){
                //choose i -> dp_{i,j,k} = dp_{i-1,j,k}
                if(j) add(dp[j][k],sum1[j-1][k]); //choose j
                if(k) add(dp[j][k],sum2[j-1][k-1]); //choose k
            }
        }
        for(int j=0;j<=i-1;j++){
            for(int k=0;k<j;k++){
                sum1[j][k]=dp[j][k],sum2[j][k]=dp[j][k];
                if(j) add(sum1[j][k],sum1[j-1][k]);
                if(k) add(sum2[j][k],sum2[j][k-1]);
            }
        }
    }
    int ans=1;
    for(int j=1;j<=n-1;j++) add(ans,sum2[j][j-1]);
    cout<<ans<<"\n";
    return 0;
}