标签:
思路见hihocoder,用的kuangbin的矩阵快速幂,一次AC,6的一笔。
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <string> #include <stack> #include <cmath> #include <queue> #include <set> #include <map> #define FOR(i,s,t) for(int i = (s) ; i <= (t) ; ++i ) #define lchild o<<1 #define rchild o<<1|1 typedef long long ll; typedef unsigned long long ull; using namespace std; const int inf=0x3f3f3f3f; const ll INF=0x3f3f3f3f3f3f3f3f; const int maxn=1e6+5; int n; ll dp[2][8]; struct Matrix { long long mat[8][8]; }; Matrix mul(Matrix a,Matrix b) { Matrix ret; for(int i=0;i<8;i++) for(int j=0;j<8;j++) { ret.mat[i][j]=0; for(int k=0;k<8;k++) { ret.mat[i][j]+=a.mat[i][k]*b.mat[k][j]; ret.mat[i][j]%=(12357); } } return ret; } Matrix pow_M(Matrix a,int n) { Matrix ret; memset(ret.mat,0,sizeof(ret.mat)); for(int i=0;i<8;++i)ret.mat[i][i]=1; Matrix temp=a; while(n) { if(n&1)ret=mul(ret,temp); temp=mul(temp,temp); n>>=1; } return ret; } int main() { //freopen("in.txt","r",stdin); Matrix a; memset(a.mat,0,sizeof a.mat); for(int i=0;i<8;++i)a.mat[i][7-i]=1; a.mat[3][7]=1; a.mat[6][7]=1; a.mat[7][3]=1; a.mat[7][6]=1; ll b[8]={0,0,0,0,0,0,0,1}; while(cin>>n) { Matrix tmp = pow_M(a,n); ll ans = 0; for(int i=0;i<8;++i) { ans += b[i]*tmp.mat[i][7]; } cout<<ans<<endl; } return 0; }
hihocoder 1151 骨牌覆盖问题 二 (矩阵快速幂)
标签:
原文地址:http://www.cnblogs.com/bruce27/p/5064152.html