【题目链接】 http://poj.org/problem?id=3420
【题目大意】
给出一个4*n的矩阵,求用1*2的骨牌填满有多少方案数
【题解】
弄出不同情况的继承关系,用矩阵递推即可。
【代码】
#include <cstdio> #include <vector> #define rep(i,n) for(int i=0;i<n;i++) using namespace std; typedef vector<vector<int> > mat; typedef long long LL; int n,mod; mat mul(mat &A,mat &B){ mat C(A.size(),vector<int>(B[0].size())); rep(i,A.size())rep(j,B[0].size())rep(k,B.size())C[i][j]=(C[i][j]+A[i][k]*B[k][j])%mod; return C; } mat pow(mat A,LL n){ mat B(A.size(),vector<int>(A.size())); rep(i,A.size())B[i][i]=1; for(;n;n>>=1){if(n&1)B=mul(B,A);A=mul(A,A);} return B; } int main(){ while(scanf("%d%d",&n,&mod),n+mod){ mat b(6,vector<int>(6)); b[0][0]=1; b[0][1]=1; b[0][2]=1; b[0][3]=1; b[0][4]=1; b[0][5]=0; b[1][0]=1; b[1][1]=0; b[1][2]=1; b[1][3]=0; b[1][4]=0; b[1][5]=0; b[2][0]=1; b[2][1]=1; b[2][2]=0; b[2][3]=0; b[2][4]=0; b[2][5]=0; b[3][0]=1; b[3][1]=0; b[3][2]=0; b[3][3]=0; b[3][4]=0; b[3][5]=1; b[4][0]=1; b[4][1]=0; b[4][2]=0; b[4][3]=0; b[4][4]=0; b[4][5]=0; b[5][0]=0; b[5][1]=0; b[5][2]=0; b[5][3]=1; b[5][4]=0; b[5][5]=0; printf("%d ",pow(b,n)[0][0]); }return 0; }