快速求斐波拉契數列

2022-05-25 14:00:16 字數 1592 閱讀 6588

首先,我們先計算如下的式子

\(f[i]=f[i-2]+f[i-1]=f[i-3]+2f[i-2]=2f[i-4]+3f[i-3]......\)

這時,我們假設當前為\(f[i]=a*f[j]+b*f[j-1]\)

則是不是\(f[i]=(a+b)*f[j-1]+a*f[j-2]\)

等等,係數是不是有點眼熟\(:1,1,2...a,b,a+b\)

這不正是斐波拉契數列嗎? 所以,我們可以得到:\(f[i]=f[k]*f[i-k-1]+f[k+1]*f[i-k]\)

即\(f[k]*f[i]+f[k+1]*f[i+1]=f[i+k+1]\)

\(f[n+k]=f[k]*f[n-1]+f[k+1]*f[n]\)

\(f[n+k+1]=f[k]*f[n]+f[k+1]*f[n+1]\)

\(f[n+k-1]=f[n+k+1]-f[n+k]\)

時間複雜度為\(o(\frac+k),\)當k=\(\sqrt n\)時取最小,得出結果\(o(\sqrt n).\)

**:

#include#include# define ll long long

void make(ll n,ll &x,ll &y,ll m)////x:fib[n] ; y:fib[n+1] ; m:mod

; ////特判

if(n<2)

if(n==2)

////求k,並遞迴求解fib[k]及f[k+1]

ll k=sqrt(n);

make(k,a,b,m);

////從fib[k]到fib[k*k]的變化

for(ll i=1;i<=k;++i)

k*=k;

////如果已經得到解(n為完全平方數),退出

if(k==n)

////如果沒有,則從k*k迭代到n

上**:

#include#include#includeusing namespace std;

# define type templatetype inline t read1()

while('0'<=k&&k<='9')t=(t<<3)+(t<<1)+(k^48),k=getchar();

return flag?-t:t;

}# define ll long long

class mat

mat(arr k):a(k){}

mat(ll x,ll y)

# undef vec

# undef arr

};type t quickpow(t k,const ll n,ll mod)

else

return tem;

}# define read read1()

int main()

斐波拉契數列

斐波拉契數列 1 1 2 3 5 8 13 21 34.其中每乙個數字都是前兩個數字的和。遞迴計算 long fibonacci int n 非遞迴計算 long fibonacci int n return result 這個函式的遞迴實現使用了雙重遞迴 double recursion 函式對本...

斐波拉契數列

編寫彙編程序列印1 1000的斐波拉契數列 原始碼assume cs code,ss stack,ds data data segment fibo dw 0,1,64 dup 0 str db the fibo list is 0ah,0dh,data ends stack segment db ...

斐波拉契數列

斐波拉契數列 這個數列從第三項開始,每一項都等於前兩項之和。已知斐波拉契數列的前兩項都是1,我們定義求斐波拉契數列的第n項 n 50 的函式為fbnq,請補充完成對fbnq函式的定義。輸入格式 共一行,為乙個正整數。輸出格式 共一行,為乙個正整數。輸入樣例 7輸出樣例 13 斐波拉契數列 def f...