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]);
}
经常手玩式子,前几天的测试根本没想到卡特兰数然后用组合数硬生生凑了出来,然后这个题的错排。。
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]);
}
相关文章推荐
- 2017.8.10 奖励关 思考记录
- 2017.9.24 虔诚的墓主人 思考记录
- 2017.3.13 木棍分割 思考记录
- 2017.10.6 单词 思考记录
- KMP算法问题简单思考记录
- 2017.3.16 聪聪可可 思考记录(非常不容易)
- 2017.10.19 起床困难综合征 思考记录
- 2017.6.21 大都市meg 思考记录
- 推荐一种新的思考、记录方法“思维导图”
- 2017.4.5 假期的宿舍 思考记录
- 2017.10.28 压缩 思考记录
- 2017.4.19 细胞分裂 思考记录
- 对查询数据库中第M到N条记录的思考3
- 2017.4.23 税收与补贴问题 思考记录
- 2017.4.27 道路游戏 思考记录
- 像程序员一样思考 记录
- 2017.5.6 子矩阵 思考记录
- 2017.7.28 愤怒的小鸟 思考记录
- 2017.9.10 土地购买 思考记录
- 2017.9.15 最大数maxnumber 思考记录