1. 程式人生 > >計蒜客: 填數字

計蒜客: 填數字

https://nanti.jisuanke.com/t/77

曉萌這幾天使勁的往一個n 行n列的矩陣填0和1這兩個數字,n為偶數,而且矩陣由裡向外分成了n / 2層。比如n = 6時,矩陣的分層如下:

曉萌填數時有一個要求:不能存在位於不同層的兩個相鄰的1(這裡的相鄰指兩格子共用一條線)。

請你幫曉萌計算一下有多少種填法。

輸入包含多組測試資料,每組資料包含一個偶數n (2 ≤ n ≤ 500)。

請計算並輸出對2012取餘後的結果。

提示

當n = 4時

1011
0100
0100
0000

是滿足要求的

1111
0100
0100
0000

是不滿足要求的,因為第一行第二列的1和第二行第二列的1相鄰且位於不同的層。

樣例輸入

2
4

樣例輸出

16
1952

可以把圖分為四塊互不相關的部分,以下圖為例

按照圖中的線把圖形拉直可以發現每一條線都是互不相關的,

而且可以看出滿足條件的是不能有連續的1出現,

找出規律後發現是斐波那契數列。

接下來就是算這一小塊總的可能填法,為f[1] * f[3] * f[5] * ...... * f[n-1]。

上面算的只是四分之一,而事故部分又是互不相關的,所以四塊的可能數是一樣的。

所以答案為上面算出的一塊的4次方。

#include<stdio.h>
#define N 550
long long a[N];
int main()
{
	int i,n;
	long long sum;
	a[0]=1;
	a[1]=2;
	for(i=2;i<=520;i++)
		a[i]=(a[i-1]+a[i-2])%2012;
	while(scanf("%d",&n)!=EOF)
	{
		sum=1;
		for(i=1;i<=n/2;i++)
			sum=(sum*a[2*i-1])%2012;
		printf("%lld\n",(sum*sum*sum*sum)%2012);
	}
		
	return 0;
}