考虑每个位置的前一个状态 可以发现有
我们分别给他们编号 假设 现在填充到了i+1行,我们可以发现从i行可以通过填充转到i+1行的状态
第i行第j列表示 可以 从上一个转态 j 可以到达这个状态的j , 然后又了这个转态转化在使用矩阵
{00000001}为初始状态
#include <iostream> #include <algorithm> #include <string.h> #include <vector> #include <cstdio> using namespace std; typedef long long LL; const LL mod=12357; struct Matir{ LL va[8][8]; Matir(){ memset(va,0,sizeof(va)); } Matir operator *(const Matir rhs){ Matir ans; for(int i=0; i<8; i++) for(int j=0; j<8; j++){ for(int k=0; k<8; k++){ ans.va[i][j]=(ans.va[i][j]+(va[i][k]*rhs.va[k][j])%mod )%mod; } } return ans; } }model; Matir solve(int N){ Matir ans; for(int i=0; i<8; i++)ans.va[i][i]=1; Matir A=model; while(N){ if(N&1)ans=ans*A; N>>=1; A=A*A; } return ans; } int main() { for(int i=0; i<8; i++) model.va[i][8-i-1]=1; model.va[3][7]=1; model.va[6][7]=1; model.va[7][3]=1;model.va[7][6]=1; int N; while(scanf("%d",&N)==1){ if(N&1){ printf("0 ");continue; } Matir ans=solve(N); cout<<ans.va[7][7]<<endl; } return 0; }