题意:
求出斐波那契数列的第n项。
思路:
今天才知道斐波那契数列可以用矩阵求出,不过矩阵快速幂还是有很多写的方式
总结了一下,找出了自己比较喜欢的一种方式。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=100;
int n;
int a[N][N];
int tmp[N][N];
int res[N][N];
int mod = 10000;
void multi(int a[][N],int b[][N],int n)
{
memset(tmp,0,sizeof tmp);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
tmp[i][j]= (tmp[i][j] + a[i][k]*b[k][j])%mod;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=tmp[i][j];
}
void Pow(int a[][N],int n)
{
memset(res,0,sizeof res);
for(int i=1;i<=2;i++) res[i][i]=1;
while(n)
{
if(n&1)
//一般都知道矩阵的N*N的大小,这里是2
multi(res,a,2); //res=res*a;复制直接在multi里面实现了;
multi(a,a,2); //a=a*a
n>>=1;
}
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d",&n) != EOF) {
a[1][1] = 1;
a[1][2] = 1;
a[2][1] = 1;
a[2][2] = 0;
if(n == -1)
break;
Pow(a,n);
printf("%d\n",res[2][1]);
}
return 0;
}