du熊填数字

好文章忍不住转载来的,望原作者见谅

http://www.cnblogs.com/luotinghao/archive/2012/12/12/2815233.html

http://blog.youkuaiyun.com/heaven13483/article/details/8284572

研究了以上两篇文章与代码,加以综合,从完全不懂到基本清楚,希望同样不懂的人能有所收获方便大家,也方便自己,谢谢原作者的分享!

 

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相邻且位于不同的层。

 

后来想到的解法,,对n层,,则四个角上的不用考虑,,则将剩余的部分在中间用十字平均分成四部分

如上图中6层的数组,,划分成的左上角为,,则只需要一个一个分别看,,又分为。。,,,

则可以分别看成3个元素的数组,,填充0和1,但1不能相邻,,

5个元素的数组,,填充0和1,但1不能相邻,,

同理,,n个元素的数组,,填充0和1,但1不能相邻,,各类共的有,,3*2^[(n-1)/2]-1种。。以此类推,,,即可完成

 

 

复制代码
 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 using namespace std;
 5 #define REP(i,n) for(i = 0; i < n; ++i)
 6 int main()
 7 {
 8     int i, j, n, a[1200];
 9     memset(a, 0, sizeof(a));
10     a[0] = 1;
11     a[1] = 2;
12     for (i=2; i<1200; i++) a[i] = (a[i-1] + a[i-2]) % 2012;
13     while (cin>>n) 
14     {
15         int ans = 1;
16         for( i = 1; i <= n/2; i++)
17         {
18             REP(j, 4) ans = (ans * a[2*i-1]) % 2012;
19         }
20         cout<<ans<<endl;
21     }
22 }
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值