矩陣運算 + 快速冪。
快速冪演算法的模板可以參考這裡。
用演算法4我們1秒內最多可以算到 108
級別,那當 n 更大時該怎麼辦呢?
可以先利用矩陣運算的性質將通項公式變成冪次形式,然後用平方倍增(快速冪)的方法求解第 n
項。首先我們定義向量
xn=[anan−1],邊界:x1=[a1a0]
然後我們可以找出矩陣:
a=[1110]
則有:xn=xn−1×a
所以:xn=x1×an−1
由於矩陣具有結合律,所以我們可以先求出 an−1%p
,然後再用 x1 左乘,即可求出 xn,向量 xn 的第乙個元素就是 an
時間複雜度分析:快速冪的時間複雜度是 o(logn)
,所以演算法5的時間複雜度也是 o(logn)。
。根據斐波那契數項之間的關係構造矩陣。
矩陣形如。
#includeusing namespace std;
const int n=3;
int n,m;
int a[n][n]=,,
},f[n]=
;void mul1(int a,int b[n],int c)
;for
(int i=0;i;i++)
for(int j=0;j;j++)
temp[i]=(temp[i]+(long long)a[j]*b[j][i])%m;
memcpy
(c,temp,sizeof temp);}
void mul2(int a[n],int b[n],int c[n])//第二維大小要定義
;for
(int i=0;i;i++)
for(int j=0;j;j++)
for(int k=0;k;k++)
temp[i][j]=(temp[i][j]+(long long)a[i][k]*b[k][j])%m;
memcpy
(c,temp,sizeof temp);}
int main()
cout<;
return 0;
}
斐波那契(矩陣快速冪)
斐波那契數列,即fib n fib n 1 fib n 2 fib n fib n 1 fib n 2 fib n fib n 1 fi b n 2 就這麼乙個數列,顯然可以直接遞推求解,時間複雜度o n o n o n 似乎沒什麼問題。然後就遇到了這個,n nn的取值範圍最大是2 1 09 2 t...
矩陣快速冪 斐波那契數列
time limit 1000 ms memory limit 128 mb 通過小l的不懈努力,他即將成為大神啦,他登上了大神專屬的頒獎臺。在頒獎台上,他即將領取代表著大神的無限榮譽的勳章。小l走上頒獎台後,在台上發現了乙個製作精美的盒子。榮譽勳章就在盒子裡面。小l發現這個盒子被上了鎖,在這個盒子...
矩陣快速冪 斐波那契數列
先來實現乙個矩陣相乘的函式吧。const int mod 10000 struct mat mat mat mul mat x,mat y 實現兩個矩陣相乘,返回的還是乙個矩陣。return res 其實和普通快速冪類似,只不過這裡需要得到的是乙個矩陣下面來實現乙個矩陣快速冪 int pow int...