#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; typedef __int64 lld; const int maxn =1005; const int maxm =1005; int n , m; int mod; struct Matrix{ int n,m; int a[1<<5][1<<5];//a[maxn][maxm]会错 不懂C++伤不起 void clear(){ n = m = 0; memset(a,0,sizeof(a)); } Matrix operator + (const Matrix &b) const{ Matrix tmp; tmp.n = n ; tmp.m = m; for(int i = 0 ; i < n ; i++){ for(int j = 0; j < m; j++){ tmp.a[i][j] = a[i][j] + b.a[i][j]; } } return tmp; } Matrix operator - (const Matrix &b) const{ Matrix tmp; tmp.n = n ; tmp.m = m; for(int i = 0 ; i < n ; i++){ for(int j = 0; j < m; j++){ tmp.a[i][j] = a[i][j] - b.a[i][j]; } } return tmp; } Matrix operator * (const Matrix &b) const{ Matrix tmp; tmp.clear(); tmp.n = b.n ; tmp.m = b.m; for(int i = 0 ; i < n ; i++){ for(int j = 0; j < m; j++){ for(int k =0 ; k < m; k++){ tmp.a[i][j] = (tmp.a[i][j]+(lld)a[i][k] * (lld)b.a[k][j])%mod; } } } return tmp; } }; int statue[1<<5][1<<5]; int size = 4; int left(int a){ return 1<<a; } void init(int ft , int sd , int idx){ if(idx >= 4){ statue[sd][ft] = 1; return ; } if( ! (ft & left(idx)) ){ init(ft , sd+left(idx) ,idx+1); } if( ft & left(idx)) { init(ft , sd ,idx +1); } if(idx + 1 <size && (ft & left(idx)) && (ft & left(idx+1))){ init(ft, sd+left(idx)+left(idx+1),idx+2); } } void set(Matrix &f){ f.clear(); f.n = f.m =left(size); for(int i = 0 ; i < left(size); i++){ for(int j = 0 ; j < left(size) ; j++){ f.a[i][j]=statue[i][j]; } } } int gao(int n, Matrix f){ Matrix tp ; tp.clear(); tp.n = tp.m = left(size); tp.a[left(size)-1][0]=1; while(n){ if(n&1) tp = f * tp; f = f * f; n>>=1; } return tp.a[left(size)-1][0]; } int main(){ int i ,j ; memset(statue,0 ,sizeof(statue)); for(i = 0 ; i < (1<<size);i++){ init(i , 0 , 0); } while(scanf("%d%d",&n,&m)!=EOF ){ if(n+m == 0)break; mod = m; Matrix f ; set(f); printf("%d\n",gao(n,f)); } return 0; }
Quad Tiling
最新推荐文章于 2020-12-19 11:58:32 发布