链接:点击打开链接
题意:我们有一个2xN的长条形棋盘,然后用1x2的骨牌去覆盖整个棋盘。对于这个棋盘,一共有多少种不同的覆盖方法
代码:
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const long long MOD=19999997;
struct node{
long long m[2][2];
}P,I;
node mul(node a,node b){
node c;
long long i,j,k,tmp;
for(i=0;i<2;i++){
for(j=0;j<2;j++){
tmp=0;
for(k=0;k<2;k++)
tmp=(tmp+a.m[i][k]*b.m[k][j]%MOD)%MOD;
c.m[i][j]=tmp;
}
}
return c;
}
node quickmod(node a,long long b){
long long i,j;
while(b){
if(b&1)
I=mul(I,a);
b>>=1;
a=mul(a,a);
}
return I;
}
int main(){
long long n,i,j; //f[n]=f[n-1]+f[n-2],直接构造矩阵,然后快速幂
while(scanf("%lld",&n)!=EOF){ //矩阵构造可以学一下线性代数的初等阵变换
for(i=0;i<2;i++)
for(j=0;j<2;j++)
I.m[i][j]=(i==j);
P.m[0][0]=0,P.m[0][1]=1;
P.m[1][0]=1,P.m[1][1]=1;
P=quickmod(P,n-1);
printf("%lld\n",(P.m[0][1]+P.m[1][1])%MOD);
}
return 0;
}