您的位置:首页 > 其它

2017.10.9 放棋子 思考记录

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

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

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
[0];i>=1;i--)
printf("%d",f
[i]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: