时间限制:1秒 空间限制:32768K 热度指数:230492
题目描述
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
Point:
class Solution {
public:
typedef struct {
int d[2][2];
}Ma;
int rectCover(int number) {
if(number==0)return 0;
if(number==1)return 1;
Ma q={1,0,0,1};//单位阵
Ma res={1,1,1,0};
while(number){ //矩阵快速幂
if(number&1){
q=comb(res,q);
}
number>>=1;
res=comb(res,res);
}
return q.d[0][0];
}
Ma comb(Ma a,Ma b) //矩阵乘法
{
Ma c;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
c.d[i][j]=0;
for(int k=0;k<2;k++)
c.d[i][j]+=a.d[i][k]*b.d[k][j];
}
return c;
}
};