POJ 3070 Fibonacci (矩阵)
构造矩阵
0 1 * a = b
1 1 b a+b
然后高速幂
也能够依照题目所给的直接高速幂
#include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <cstring> #define N 30 using namespace std; const int mod = 10000; struct matrix { int a[2][2]; }origin; int n=2,m; matrix multiply(matrix x,matrix y) { matrix temp; memset(temp.a,0,sizeof(temp.a)); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { for(int k=0;k<n;k++) { temp.a[i][j]+=x.a[i][k]*y.a[k][j]; temp.a[i][j]=(temp.a[i][j])%mod; } } } return temp; } matrix matmod(matrix A,int k) { matrix res; memset(res.a,0,sizeof res.a); for(int i=0;i<n;i++)res.a[i][i]=1; while(k) { if(k&1) res=multiply(res,A); k>>=1; A=multiply(A,A); } return res; } void print(matrix x) { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) printf("%d ",x.a[i][j]); puts(""); } printf("---------------\n"); } int main() { int t; while(scanf("%d",&t)!=EOF) { if(t==0) { printf("0\n"); continue; } else if(t==-1)break; else { origin.a[0][0]=0; origin.a[0][1]=1; origin.a[1][0]=1; origin.a[1][1]=1; matrix ans = matmod(origin,t-1); printf("%d\n",(ans.a[0][0]+ans.a[0][1])%mod); } } return 0; }