Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
6530 18级张钰晨 2021北京队选拔模拟赛1-B C++ 通过 100 103 MS 16036 KB 1391 2021-04-03 11:14:52

Tests(10/10):


#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;return 0;} while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();if(ch==EOF){kp=0;return 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();if(!n)return 0;m=read();if(!m)return 0; 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]%m); } return 0; }


测评信息: