2017.10.9 放棋子 思考记录

来源:互联网 发布:c语言char 编辑:程序博客网 时间:2024/06/09 19:34

。这个题根本没想到错排,但它似乎离散为斜对角之后很有规律,于是打表,推出了式子。。。

经常手玩式子,前几天的测试根本没想到卡特兰数然后用组合数硬生生凑了出来,然后这个题的错排。。

f表示答案  g表示当前矩阵第一行第一个可以放的点的答案

f【i】=g【i】*(i-1)

g【i】=g【i-1】*(i-2)+f【i-2】


注意要用高精,还要开足位,第一遍交60、、、


码:

#include<iostream>#include<cstdio>using namespace std;int ans,n,i,g[205][2005],f[205][2005],j,laji,jw;int main(){scanf("%d",&n);for(i=1;i<=n;i++)for(j=1;j<=n;j++)scanf("%d",&laji);f[2][1]=1;g[2][1]=1;f[3][1]=2;g[3][1]=1;f[2][0]=1;g[2][0]=1;f[3][0]=1;g[3][0]=1;for(i=4;i<=n;i++){//g[i]=g[i-1]*(i-2)+f[i-2];jw=0;g[i][0]=g[i-1][0];for(j=1;j<=g[i-1][0];j++){int tmp=jw;jw=(g[i-1][j]*(i-2)+jw)/10;g[i][j]=(g[i-1][j]*(i-2)+tmp)%10;}while(jw>0){g[i][++g[i][0]]=jw%10;jw/=10;}int sx=max(g[i][0],f[i-2][0]);jw=0;g[i][0]=sx;for(j=1;j<=sx;j++){int tmp=jw;jw=(g[i][j]+f[i-2][j]+jw)/10;g[i][j]=(g[i][j]+f[i-2][j]+tmp)%10;}if(jw>0)g[i][++g[i][0]]=jw;//f[i]=g[i]*(i-1);jw=0;f[i][0]=g[i][0];for(j=1;j<=g[i][0];j++){int tmp=jw;jw=(g[i][j]*(i-1)+jw)/10;f[i][j]=(g[i][j]*(i-1)+tmp)%10;}while(jw>0){f[i][++f[i][0]]=jw%10;jw/=10;}}for(i=f[n][0];i>=1;i--)printf("%d",f[n][i]);}