新获得快速求斐波那契数列的方法。
1 1
A= 1 0 f(n)=A^n。
/*//////////////////////////////
POJ 3070 快速矩阵幂
题意:
用矩阵求斐波那契数列
//////////////////////////////*/
#include <cstdio>
#include <cstring>
#include <cmath>
int n,mod=10000;
struct Matrix
{
int m[2][2];
void clear()
{
memset(m,0,sizeof(m));
}
}E, Z;
Matrix Mut(Matrix A, Matrix B)
{
Matrix ans;
for (int i = 0; i<2; i++)
for (int j = 0; j<2; j++)
{
ans.m[i][j] = 0;
for (int k = 0; k<2; k++)
{
ans.m[i][j] += ((A.m[i][k])*(B.m[k][j]));
ans.m[i][j]%=mod;
}
}
return ans;
}
Matrix Pow(Matrix A, int b)
{
Matrix t = A, ans = E;
while (b)
{
if (b % 2)
ans = Mut(ans, t);
b /= 2;
t = Mut(t, t);
}
return ans;
}
int main()
{
//freopen("in.txt", "r", stdin);
Matrix A;
int t;
while(scanf("%d",&n)!=EOF&&n!=-1)
{
if(n==0)
{
printf("0\n");
continue;
}
A.m[0][0]=1;A.m[0][1]=1;
A.m[1][0]=1;A.m[1][1]=0;
E=A;
Matrix ans=Pow(A,n-1);
printf("%d\n",ans.m[0][1]);
}
return 0;
}