vijosP1194 Domino

vijosP1194 Domino

链接:https://vijos.org/p/1194

【思路】

  矩阵相乘。

  参考Matrix67的文章:

  

【代码】

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #define FOR(a,b,c) for(int a=(b);a<(c);a++)
 5 using namespace std;
 6 
 7 const int maxn = 40;
 8 const int ag[]={0,3,6,12,15,24,27,30};
 9 typedef long long LL;
10 
11 int n,m,MOD;
12 
13 struct Matrix{
14     int r,c;
15     LL N[maxn][maxn];
16     void init(int r,int c) {
17         this->r=r, this->c=c;
18         memset(N,0,sizeof(N));
19     }
20     Matrix operator*(Matrix& B)const{
21         Matrix A=*this,C;
22         C.init(A.r,B.c);
23         for(int i=0;i<C.r;i++)
24            for(int j=0;j<C.c;j++)
25               for(int k=0;k<A.c;k++)
26                  C.N[i][j] = (C.N[i][j]+A.N[i][k]*B.N[k][j])%MOD;
27         return C;
28     }
29     Matrix pow(int p) {
30         Matrix tmp=*this;
31         Matrix ans;
32         ans.init(r,r);
33         for(int i=0;i<r;i++) ans.N[i][i]=1;
34         while(p) {
35             if(p&1) ans=ans*tmp;
36             tmp=tmp*tmp;
37             p>>=1;
38         }
39         return ans;
40     }
41 };
42 int main() {
43     scanf("%d%d%d",&n,&m,&MOD);
44     Matrix ans;
45     int all=1<<m;
46     ans.init(all,all);
47     for(int i=0;i<all;i++)    
48        for(int j=0;j<all;j++)
49            if( ((~i)&j) == ((~i)&(all-1))) {
50                   int l=0;
51                   for(int r=0;r<=8;r++) l=l||((i&j)==ag[r]);
52                   ans.N[i][j]=l;
53            }
54     ans=ans.pow(n);
55     printf("%d",ans.N[all-1][all-1]);
56     return 0;
57 } 
原文地址:https://www.cnblogs.com/lidaxin/p/4922609.html