計蒜客: 填數字
阿新 • • 發佈:2018-11-26
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; }