这周的hihocoder的题目,感觉挺经典的,就贴上来吧。显然对于这种题目,显然需要求出递推关系后用矩阵乘法优化,详细的内容可以直接看hiho给的提示:
3xN骨牌问题。代码如下:
#include <cstdio>
#define MOD 12357
void p(int a[][8],int b[][8])
{
int t[8][8]={0};
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
for(int k=0;k<8;k++) t[i][j]=(t[i][j]+a[i][k]*b[k][j])%MOD;// 矩阵乘法
for(int i=0;i<8;i++)
for(int j=0;j<8;j++) a[i][j]=t[i][j];//保存结果
}
int main()
{
int r[8][8]={0};
int b[8][8]={0,0,0,0,0,0,0,1
,0,0,0,0,0,0,1,0
,0,0,0,0,0,1,0,0
,0,0,0,0,1,0,0,1
,0,0,0,1,0,0,0,0
,0,0,1,0,0,0,0,0
,0,1,0,0,0,0,0,1
,1,0,0,1,0,0,1,0};//关系矩阵,b[i][j]表示状态i可以转变为状态j
for(int i=0;i<8;i++) r[i][i]=1;
int n;
scanf("%d",&n);
while(n){
if(n&1) p(r,b);
p(b,b);
n>>=1;
}
printf("%d\n",r[7][7]);
return 0;
}