POJ 3070 Fibonacci矩阵快速幂 --斐波那契

时间:2023-03-09 05:03:38
POJ 3070  Fibonacci矩阵快速幂 --斐波那契

题意:

求出斐波那契数列的第n项的后四位数字

思路:f[n]=f[n-1]+f[n-2]递推可得二阶行列式,求第n项则是这个矩阵的n次幂,所以有矩阵快速幂模板,二阶行列式相乘, sum[ i ] [ j ]+=v[i][k]*u[k][j] ___k==1->j;

POJ 3070  Fibonacci矩阵快速幂 --斐波那契

模板:

#include<stdio.h>
#include<map>
using namespace std;
//矩阵快速幂
struct node
{
int m[10][10];
}a,b;
node juzhen(node v,node u)//结构体函数
{
node ans;
for(int i=1;i<3;i++)
for(int j=1;j<3;j++)
ans.m[i][j]=0;
for(int i=1;i<3;i++)
for(int j=1;j<3;j++)
for(int k=1;k<3;k++)
ans.m[i][j]=(ans.m[i][j]+u.m[i][k]*v.m[k][j])%10000;
return ans;
}
node quick(int n)
{
node ans,t;
t.m[1][1]=1,t.m[1][2]=1,t.m[2][1]=1,t.m[2][2]=0;
for(int i=1;i<3;i++)//初始化为1
for(int j=1;j<3;j++)
if(i==j)
ans.m[i][j]=1;
else
ans.m[i][j]=0; while(n)
{
if(n&1)
ans=juzhen(ans,t);
n=n>>1;
t=juzhen(t,t);
}
return ans;
}
int main()
{
int n;
while(~scanf("%d",&n)&&n!=-1)
{
if(n<=2)
{
if(n==0) printf("0\n");
if(n==1) printf("1\n");
if(n==2) printf("1\n");
continue;
}
node k;
k=quick(n);
printf("%d\n",k.m[1][2]);
}
return 0;
}