Fibonacci
题目链接:点击打开链接
分析:以前用过快速幂,但是没想到还可以用在矩阵上,而且这么快,原理上和快速幂没有区别,具体看题干一目了然,只是乘法变成了矩阵的乘法。
矩阵快速幂的几个博客:1、点击打开链接
2、点击打开链接
代码一如下:
#include<stdio.h>
#include<string.h>
long long m;
struct Node {
long long M[2][2];
}origin,res;
Node multiply(Node a,Node b)
{
Node tem;
memset(tem.M,0,sizeof(tem.M));
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++)
tem.M[i][j]=(tem.M[i][j]+a.M[i][k]*b.M[k][j])%10000;
return tem;
}
int cal()
{
res.M[0][0]=res.M[1][1]=1; res.M[0][1]=res.M[1][0]=0;
origin.M[0][0]=origin.M[0][1]=origin.M[1][0]=1; origin.M[1][1]=0;
while(m)
{
if(m&1)
res=multiply(res,origin);
m>>=1;
origin=multiply(origin,origin);
}
}
int main()
{
while(scanf("%lld",&m))
{
if(m==-1)
break;
cal();
// printf("%lld %lld\n%lld %lld\n",res.M[0][0],res.M[0][1],res.M[1][0],res.M[1][1]);
printf("%lld\n",res.M[1][0]);
}
return 0;
}
代码二(思路一样,函数有区别):
#include<stdio.h>
#include<string.h>
long long m;
struct Node {
long long M[2];
}res;
struct Node1 {
long long dan[2][2];
}origin;
Node multiply(Node x,Node1 orig)
{
Node tem;
for(int j=0;j<2;j++)
{
tem.M[j]=0;
for(int k=0;k<2;k++)
tem.M[j]=(tem.M[j]+x.M[k]*orig.dan[k][j])%10000;
}
return tem;
}
Node1 mul2(Node1 a,Node1 b)
{
Node1 tem;
memset(tem.dan,0,sizeof(tem.dan));
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++)
tem.dan[i][j]=(tem.dan[i][j]+a.dan[i][k]*b.dan[k][j])%10000;
return tem;
}
int cal()
{
res.M[0]=1;res.M[1]=0;
origin.dan[0][0]=origin.dan[0][1]=origin.dan[1][0]=1; origin.dan[1][1]=0;
while(m)
{
if(m&1)
res=multiply(res,origin);
m>>=1;
origin=mul2(origin,origin);
}
}
int main()
{
while(scanf("%lld",&m))
{
if(m==-1)
break;
cal();
printf("%lld\n",res.M[1]);
}
return 0;
}