矩阵乘法+快速幂求斐波那契
原理:
f(n+1) 0 1 1 f(n) 0 1 1 1 1 f(n-1) 0 1 1 f(1) 0
= * = * * = * ' ' '*
f(n) 0 1 0 f(n-1) 0 1 0 1 0 f(n-1) 0 1 0 f(0) 1
#include <bits/stdc++.h>
#define MAX_INT ((unsigned)(-1)>>1)
#define MIN_INT (~MAX_INT)
#define db printf("where!\n");
#define pb push_back
using namespace std;
#define ll long long
template<class T>inline void read(T &res){
char c;T flag=1;
while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';
while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
}
const int N=100005;
int n;
int a[2][2]={1,1,1,0};
int b[2][2]={1,0,0,1};
void jzcf(int a[2][2],int b[2][2])
{
int i,j,k;
int c[2][2];
for(i=0;i<2;i++){
for(j=0;j<2;j++){
c[i][j]=0;
for(k=0;k<2;k++){
c[i][j]=(c[i][j]+a[i][k]*b[k][j]);
}
}
}
for(i=0;i<2;i++){
for(j=0;j<2;j++){
b[i][j]=c[i][j];
}
}
}
void ksm(int n)
{
if(n==0){
cout<<0<<endl;
}
else{
n--;
while(n){
if(n%2==1){
jzcf(a,b);
}
jzcf(a,a);
n/=2;
}
cout<<b[0][0]<<endl;
}
}
int main()
{
while(cin>>n){
ksm(n);
a[0][0]=a[0][1]=a[1][0]=b[0][0]=b[1][1]=1;
a[1][1]=b[0][1]=b[1][0]=0;
}
return 0;
}