点击打开链接
题意:3*n棋盘 用1*2骨牌覆盖 求方法数 ?(n<=1e9)
最后一列有三格 每格是否被覆盖,转换成8种状态
设矩阵M[i][j] 增加一列后,最后一列的状态从i->j的方法数 (使得前面列都填满)
A[i][j]前0列增加0列,最后一列由i->j的方法数 则最后答案为A*(M^n) :A[7][7]
#include using namespace std; typedef long long ll; const ll mod=12357; const int N=8; int M[N][N];//M[i][j] 增加一列后,最后一列的状态从i->j的方法数 int A[N][N];//前0列最后一列由i->j的方法数 void mul(int a[][N],int b[][N],int c[][N]) { int t[N][N]; for(int i=0;i>n) { if(n%2) { puts("0"); continue; } for(int i=0;i<8;i++) A[i][i]=M[i][7-i]=1; M[3][7]=M[7][3]=1;//填最后一列i时,要使前i-1列是填满的 M[6][7]=M[7][6]=1; //i->j:A[i][k]*B[k][j] 增加一列,乘完后,最后一列由i->j //答案为从0增加n列 则求A*M^n即可 while(n) { if(n&1) mul(M,A,A); mul(M,M,M); n>>=1; } cout<