由于我们只要计算出第n个斐波那契数就可以了,所以只要用到数列的前3项就行了
于是定义4个变量p,q,r,s,其中q,r,s是前三项,每次要计算的时候把前三项移到p,q,r上,再用s计算下一项,这样q,r,s就变成了前三项
int tribonacci(int n){
if(n==0)
return 0;
if(n<=2)
return 1;
int p=0,q=0,r=1,s=1;
for(int i=3;i<=n;i++)
{
p=q;
q=r;
r=s;
s=p+q+r;
}
return s;
}
也可以用矩阵快速幂来求,上面的时间复杂度是n,这个时间复杂度是lgn,就是快速幂的耗时
#define ROW 3
#define COL 3
typedef struct Martrix
{
long long a[ROW][COL];
}Martrix;
Martrix martrix_multiply(Martrix* a,Martrix* b)
{
Martrix res;
for(int i=0;i<ROW;i++)
{
for(int j=0;j<COL;j++)
{
res.a[i][j]=0;
}
}
for(int i=0;i<ROW;i++)
{
for(int j=0;j<COL;j++)
{
for(int k=0;k<COL;k++)
{
res.a[i][j]+=a->a[i][k]*b->a[k][j];
}
}
}
return res;
}
Martrix martrix_quickpow(Martrix* base,int pow)
{
Martrix ans={{{1,0,0},{0,1,0},{0,0,1}}};
if(pow==0)
return ans;
while(pow)
{
if(pow&1)
ans=martrix_multiply(&ans,base);
pow>>=1;
*base=martrix_multiply(base,base);
}
return ans;
}
int tribonacci(int n){
if(n==0)
return 0;
if(n<=2)
return 1;
Martrix a={{{1,1,1},{1,0,0},{0,1,0}}};
a=martrix_quickpow(&a,n-2);
return (a.a[0][0]+a.a[0][1]);
}
至于a数组是什么样,是几阶的,里面的元素是是什么,要根据具体题目而定,
这里对结构体中的数组初始化一直很不熟悉,这次学习了
注意到,快速幂和乘法的参数都是指针,可以节省空间