这里放一下矩阵快速幂的模板.
首先我们怎样记得转移矩阵的行列数呢,我么用手比划一下,先横,再竖着.为答案矩阵的一个元素,
所以第一个矩阵的列数与转移矩阵的横数相等,转移矩阵的列数与答案矩阵的列数相等...
#include<bits/stdc++.h> #define db double #define ll long long #define reg register #define pb(x) push_back(x) #define fup(i,x,y) for(reg int i=x;i<=y;++i) #define fdw(i,x,y) for(reg int i=x;i>=y;--i) using namespace std; const int mod=10000; int n; struct wy { ll a[5][5]; wy(){memset(a,0,sizeof(a));} inline void clear () { memset(a,0,sizeof(a)); } wy friend operator *(wy a,wy b) { wy c; fup(i,1,2) fup(j,1,2) fup(k,1,2) c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%mod; return c; } wy friend operator ^(wy a,ll y) { wy c; fup(i,1,2) c.a[i][i]=1; while(y) { if(y&1) c=c*a; y>>=1; a=a*a; } return c; } }A,B,C; inline int read() { int x=0,ff=1; char ch=getchar(); while(!isdigit(ch)) {if(ch==‘-‘) ff=-1;ch=getchar();} while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} return x*ff; } int main() { freopen("1.in","r",stdin); B.a[1][1]=0;B.a[1][2]=1; B.a[2][1]=1;B.a[2][2]=1; while(1) { n=read(); if(n==-1) break; if(n<=2) { if(n==0) puts("0"); else puts("1"); continue; } A.clear(); A.a[1][1]=1;A.a[1][2]=1; C=B^(n-2); A=A*C; printf("%lld\n",A.a[1][2]); } return 0; }
原文:https://www.cnblogs.com/gcfer/p/12720606.html