首先,我們先計算如下的式子
\(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...