P2070 - 骨牌覆盖

 

Description

有一个3*n的棋盘让你放入若干1*2的骨牌,要求将整棋盘恰好覆盖满。求方案数!

Input

一个整数n。

Output

方案数模12357的值。

Sample Input

2

Sample Output

3

Hint

1<=n<=100000000

Source

递推,矩阵快速幂

 

这题先通过打表找出递推规律,然后推出转移矩阵,使用矩阵快速幂即可。

 

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<iomanip>
 4 #include<cstring>
 5 #include<cstdlib>
 6 #include<cstdio>
 7 #include<queue>
 8 #include<ctime>
 9 #include<cmath>
10 #include<stack>
11 #include<map>
12 #include<set>
13 #define rep(i,a,b) for(register int i=a;i<=b;i++)
14 #define il inline
15 #define ll long long
16 using namespace std;
17 const int N=2;
18 int gi();
19 int mod=12357,n;
20 int a[N][N][N],s[N][N];
21 void muti(int c,int d){
22   rep(i,0,1)
23     rep(j,0,1)
24       rep(k,0,1)
25         s[i][j]=(s[i][j]+a[c][i][k]*a[d][k][j])%mod;
26   rep(i,0,1)
27     rep(j,0,1)
28     a[c][i][j]=s[i][j],s[i][j]=0;
29 }
30 int main() {
31     freopen("HNOI.in","r ",stdin);
32     freopen("HNOI.out","w",stdout);
33     n=gi();
34     if(n&1){puts("0");return 0;}
35     n>>=1;
36     a[0][0][0]=1,a[0][0][1]=3,a[1][0][1]=-1,a[1][1][0]=1,a[1][1][1]=4;
37     
38     while(n) {
39       if(n&1) muti(0,1);
40       muti(1,1);
41       n>>=1;
42     }
43     cout<<a[0][0][0];
44     return 0;
45 }
46 
47 int gi() {
48     int res=0,f=1;
49     char ch=getchar();
50     while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
51     if(ch=='-') ch=getchar(),f=-1;
52     while(ch>='0'&&ch<='9') res=res*10+ch-'0',ch=getchar();
53     return res*f;
54 }
View Code

 

posted @ 2017-04-02 11:26  Yinpz_23  阅读(171)  评论(0编辑  收藏  举报