#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int X[2][2]={1,1,1,0},Y[2][2]={1,0,0,1},T[2][2]={0,0,0,0};
int x[2][2],y[2][2],t[2][2];
int matrix(int m){
while(m){
if(m&1){
t[0][0]=x[0][0]*y[0][0]+x[0][1]*y[1][0];
t[0][1]=x[0][0]*y[0][1]+x[0][1]*y[1][1];
t[1][0]=x[1][0]*y[0][0]+x[1][1]*y[1][0];
t[1][1]=x[1][0]*y[0][1]+x[1][1]*y[1][1];
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
y[i][j]=t[i][j];
}
}
}
m>>=1;
t[0][0]=x[0][0]*x[0][0]+x[0][1]*x[1][0];
t[0][1]=x[0][0]*x[0][1]+x[0][1]*x[1][1];
t[1][0]=x[1][0]*x[0][0]+x[1][1]*x[1][0];
t[1][1]=x[1][0]*x[0][1]+x[1][1]*x[1][1];
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
x[i][j]=t[i][j];
}
}
}
return y[0][0];
}
int Fibonacci(int n) {
if(n<2) return n;//第0项为0
int ans=matrix(n-1);
return ans;
}
void init(){
memcpy(x,X,sizeof(x));
memcpy(y,Y,sizeof(y));
memcpy(t,T,sizeof(t));
}
int main(){
int n;
while(scanf("%d",&n)==1){
init();
printf("%d\n",Fibonacci(n));
}
return 0;
}
斐波那契数列
最新推荐文章于 2022-04-09 23:26:17 发布