POJ 3420 Quad Tiling (矩阵乘法)

【题目链接】 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;  
}
原文地址:https://www.cnblogs.com/forever97/p/poj3420.html