矩阵快速幂模板题
递推公式
ac代码:
#include <cstdio> #include <cstring> #include <iostream> #include <queue> #include <stack> #define mt(a) memset(a,0,sizeof(a)) using namespace std; const int mod=10000; struct Martix { int mp[5][5]; int r,c; }; Martix mul(Martix a,Martix b) { int r=a.r; int c=b.c; Martix temp; temp.r=r; temp.c=c; for(int i=0;i<r;i++) { for(int j=0;j<c;j++) { temp.mp[i][j]=0; for(int k=0;k<r;k++) { temp.mp[i][j]=(a.mp[i][k]*b.mp[k][j]+temp.mp[i][j])%mod; } } } return temp; } int pow(Martix a,int k) { Martix ans; ans.r=2; ans.c=1; ans.mp[0][0]=1;// ans.mp[1][0]=0; while(k) { if(k&1) ans=mul(a,ans); k/=2; a=mul(a,a); } return ans.mp[0][0]%mod; } int main() { int n; while(~scanf("%d",&n)) { if(n==-1) break; Martix a; if(n==0) { cout<<0<<endl; continue; } a.r=a.c=2; a.mp[0][0]=a.mp[0][1]=a.mp[1][0]=1; a.mp[1][1]=0; int key=pow(a,n-1); cout<<key<<endl; } return 0; }