Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
6567 | 18级赵嘉熠 | 2021北京队选拔模拟赛1-B | C++ | 运行出错 | 0 | 0 MS | 260 KB | 1586 | 2021-04-03 17:23:49 |
#include<bits/stdc++.h> using namespace std; const int N=1005; int n,m,ans,a[N]; int f[N][N];//f[i][j]表示前i个数的排列包含j对非法相邻数的方案数(i存在于非法相邻数对中) int g[N][N];//g[i][j]表示前i个数的排列包含j对非法相邻数的方案数(i不存在于非法相邻数对中) int main(){ freopen("a.in","r",stdin); //freopen("a.out","w",stdout); while(cin>>n>>m){ for(int i=0;i<=n;i++){ for(int j=0;j<=n;j++){ f[i][j]=0; g[i][j]=0; } } f[1][0]=1; for(int i=1;i<=n;i++){ for(int j=0;j<i;j++){ if(f[i][j]){ g[i+1][j+1]+=f[i][j]*2%m; g[i+1][j+1]%=m; if(j){ f[i+1][j-1]+=f[i][j]*j%m,f[i+1][j-1]%=m; } if(i-j-1){ f[i+1][j]+=f[i][j]*(i-j-1)%m,f[i+1][j]%=m; } } if(g[i][j]){ g[i+1][j+1]+=g[i][j],g[i+1][j+1]%=m; g[i+1][j]+=g[i][j],g[i+1][j]%=m; if(j-1){ f[i+1][j-1]+=g[i][j]*(j-1)%m; f[i+1][j-1]%=m; } if(i-j){ f[i+1][j]+=g[i][j]*(i-j)%m; f[i+1][j]%=m; } } } } cout<<f[n][0]%m<<endl; } return 0; }