百度之星2012年12月11日竞赛题目二--du熊填数字

http://astar.baidu.com/index.php?r=home/detail&id=3

题目重写如下:

Du熊填数字

Time Limit: 3000/2000 MS (C/Others)    Memory Limit: 65536/32768 K (C/Others)

 

本次组委会推荐使用C、C++

Problem Description

    du熊这几天使劲的往一个n 行n列的矩阵填0和1这两个数字,n为偶数,而且矩阵由里向外分成了n / 2层。比如n = 6时,矩阵的分层如下:


    du熊填数时有一个要求:不能存在两个相邻的1,且位于不同的层(这里的相邻指两格子共用一条线)。

    请你帮du熊计算一下有多少种填法。

Input

    输入包含多组测试数据,每组数据包含一个偶数n (2 <= n <= 500)。

Output

    请计算并输出对2012取余后的结果。

Sample Input

2

4

Sample Output

16

1952

 

Hint

当n = 4时

 

1011

0100

0100

0000

是满足要求的

 

1111

0100

0100

0000

是不满足要求的,因为第一行第二列的1和第二行第二列的1相邻且位于不同的层。


仔细分析题目之后我们可以发现数字1限制的方向是由中心向外发散的,同一层的格子填充互不受影响。由此可以从中心沿四个方向引直线将图形分成四个大块,各块之间的填充相互独立,且情形完全相同。

 

进一步,依据各个格子之间是否存在相互影响关系,可以将每个大块剥成一个一个的L型,每个L型中格子的合法填充数可以统一考虑,不同L型之间的填充互不影响。

我们以n=6的情况为例。最大的Ln-1个格子组成,这n-1个格子中不能有任意两个相邻的同时填上1。这个L型的合法填法数目(计为F(n))可以由组合方法计算出来:n-1个格子中的1必须都是被0隔开的,相当于把1插入到已有0的空档中。m个0有m+1个空档,则有,其中

在组合数学中我们知道,F(n)就是第n个Fabonacci数(第0,1个都是1)。

每个1/4块的合法填法数目为,从而整个图形的合法填法总数是

题中2<=n<=500,可以先一次性计算出n<=500的所有F(n),之后只要查表即可。

另外,如果x%y=z,则(x*n)%y=(z*n)%y,利用这一特点可以防止溢出。

PS,如果某个n使得模2012之后是0,那么大于n层的结果也是0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值