Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
6525 | 18级张钰晨 | 2021北京队选拔模拟赛1-B | C++ | 运行超时 | 0 | 1000 MS | 16044 KB | 1337 | 2021-04-03 11:03:05 |
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=1e3+5,mod=1e9+7,inf=0x3f3f3f3f; bool kp=1; inline int read(){ int x=0,f=1,ch=getchar();if(ch==EOF)kp=0; while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();if(ch==EOF)kp=0;} while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-48;ch=getchar();if(ch==EOF)kp=0;} return x*f; } int n,m; ll a[maxn][maxn],g[maxn][maxn]; int main(){ while(kp){ n=read();m=read(); memset(a,0,sizeof(a)); memset(g,0,sizeof(g)); a[1][0]=1; for(int i=2;i<=n;i++) for(int j=0;j<=i-1;j++){ a[i][j]=(a[i-1][j]*(i-j-2)%m+g[i-1][j]*2%m)%m; a[i][j]=(a[i][j]+a[i-1][j+1]*(j+1)%m-g[i-1][j+1])%m; if(j)a[i][j]=(a[i][j]+a[i-1][j-1]*2%m-g[i-1][j-1])%m; // (i-1个数j缝)*(i个位置-j个缝里-挨着(i-1))+(j个缝里挨着(i-1))*2+(j+1缝里-j+1缝里挨着i-1)+(j-1缝里-j-1缝里挨着i-1) if(j)g[i][j]=(g[i-1][j] +a[i-1][j-1]*2%m -g[i-1][j-1])%m; // (i-1个数,i-1在j缝里,和它(仅一边)形成缝) +(i-1个数,j-1个缝,和n-1形成缝 且n-1不在缝里) a[i][j]=(a[i][j]%m+m)%m; g[i][j]=(g[i][j]%m+m)%m; } printf("%lld\n",a[n][0]); } return 0; }