给定n,问4*n的平面由2*1或1*2的板砖铺满要多少块。
看图说话,可能对大神来说最难的是解决前4块。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define LL long long
const int mod=1000000007;
struct matrix
{
LL x[4][4];
};
matrix mutimatrix(matrix a,matrix b)
{
matrix temp;
memset(temp.x,0,sizeof(temp.x));
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
for(int k=0;k<4;k++)
{
temp.x[i][j]+=a.x[i][k]*b.x[k][j];
temp.x[i][j]%=mod;
}
return temp;
}
matrix k_powmatrix(matrix a,LL n)
{
matrix temp;
memset(temp.x,0,sizeof(temp.x));
for(int i=0;i<4;i++)
temp.x[i][i]=1;
while(n)
{
if(n&1)
temp=mutimatrix(temp,a);
a=mutimatrix(a,a);
n>>=1;
}
return temp;
}
int main()
{
LL n;
while(scanf("%lld",&n)!=EOF)
{
if(n==1)
{
printf("1\n");
continue;
}
if(n==2)
{
printf("5\n");
continue;
}
if(n==3)
{
printf("11\n");
continue;
}
if(n==4)
{
printf("36\n");
continue;
}
matrix st;
memset(st.x,0,sizeof(st.x));
st.x[0][0]=1;
st.x[1][0]=5;
st.x[2][0]=1;
st.x[3][0]=-1;
st.x[0][1]=1;
st.x[1][2]=1;
st.x[2][3]=1;
matrix init;
memset(init.x,0,sizeof(init.x));
init.x[0][0]=36;
init.x[0][1]=11;
init.x[0][2]=5;
init.x[0][3]=1;
st=k_powmatrix(st,n-4);
st=mutimatrix(init,st);
printf("%lld\n",(st.x[0][0]+mod)%mod);
}
return 0;
}