原理如图,具体推导过程有些复杂,可以只掌握结论使用
(画的有点丑)
题目:205 斐波那契 代码源自yxc
#include<bits/stdc++.h>
using namespace std;
int mod=10000;
void mul(int a[][2],int b[][2])
{
int c[2][2]={0},i,k,j;
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
for(k=0;k<2;k++) //进行矩阵乘法
{
c[i][j]=(c[i][j]+a[i][k]*b[k][j])%mod;
}
}
}
memcpy(a,c,sizeof(c));
}
long long fib(long long n)
{
int a[2][2]={0,1,0,0};
int f[2][2]={0,1,1,1};
long long k=n-1;
while(n) //快速幂
{
if (n & 1)
mul(a,f);
mul(f,f);
n >>=1;
}
return a[0][0];
}
int main ()
{
long long n;
cin>>n;
while(n!=-1)
{
cout<<fib(n)<<'\n';
cin>>n;
}
return 0;
}