| 比赛 |
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;
}