见代码。-&-
#include<iostream>
#include<cstdio>
#include<cstring>
typedef long long int ll;
using namespace std;
// 1.时间复杂度为 2^2
ll Fibo1(ll n)
{
if(n==1||n==0)
return n;
else
return Fibo1(n-1)+Fibo1(n-2);
}
//2.时间复杂度为 O(n)
ll Fibo2(ll n)
{
ll oneback,twoback,current;
if(n==1||n==0)
return n;
else
{
oneback=0;
twoback=1;
for(ll i=2;i<=n;i++)
{
current=oneback+twoback;
oneback=twoback;
twoback=current;
}
return current;
}
}
int main()
{
// freopen("in.txt","r",stdin);
ll n;
scanf("%I64d",&n);
printf("%I64d\n",Fibo1(n));
printf("%I64d\n",Fibo2(n));
return 0;
}
超级无敌矩阵求 斐波那契 的第n 项:
数列的递推公式为:f(1)=1,f(2)=2,f(n)=f(n-1)+f(n-2)(n>=3)
用矩阵表示为:
进一步,可以得出直接推导公式:
然后就矩阵的快速幂。(详情见代码)
题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1242
#include<iostream>
#include<cstdio>
#include<cstring>
#define N 1000000009
typedef long long int ll;
using namespace std;
struct matrix //定义矩阵
{
ll m11,m12,m21,m22;
};
matrix mil(matrix a,matrix b) // 2*2 矩阵的乘法
{
matrix ans;
ans.m11=(a.m11*b.m11%N+a.m12*b.m21%N)%N;
ans.m12=(a.m11*b.m12%N+a.m12*b.m22%N)%N;
ans.m21=(a.m21*b.m11%N+a.m22*b.m21%N)%N;
ans.m22=(a.m21*b.m12%N+a.m22*b.m22%N)%N;
return ans;
}
matrix quickpow(ll n) // 矩阵的n次幂
{
matrix m={1,1,1,0},b={1,0,0,1};
if(n==0)
return b;
while(n>0)
{
if(n&1)
b=mil(b,m);
n=n>>1;
m=mil(m,m);
}
return b;
}
int main()
{
ll n,sum;
matrix a;
while(scanf("%I64d",&n)!=EOF)
{
if(n==0)
{
printf("0\n");
continue;
}
else if(n==1)
{
printf("1\n");
continue;
}
else{
a=quickpow(n-1);
sum=a.m11%N;
printf("%I64d\n",sum);
}
}
return 0;
}