斐波那契數列,即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\times10^9
2×10
9的這麼乙個題,線性顯然不能滿足時間限制,然後就需要用矩陣快速冪求解了。
用f (n
)f(n)
f(n)
表示乙個1×2
1\times2
1×2的矩陣[fi
b(n)
,fib
(n+1
)]
[fib(n),fib(n+1)]
[fib(n
),fi
b(n+
1)],推道依然按照遞推式,我們發現,f(n
+1
)f(n+1)
f(n+1)
顯然就是f(n
)f(n)
f(n)
中將第二項前移做為第一項,第一項和原第二項的和作為新的第二項(遞推),即相當於每次乘以了乙個2×2
2\times2
2×2的矩陣,我們可以求出這個矩陣是[01
11
]\left[ \begin 0&1\\1&1 \end \right]
[0111
]我們記這個矩陣為zzz
也就是說,f(1
)=f(
0)×z
f(1)=f(0)\times z
f(1)=f
(0)×
z,相應的,f(2
)=f(
1)×z
=f(0
)×z×
z=f(
0)×z
2f(2)=f(1)\times z=f(0)\times z\times z=f(0)\times z^2
f(2)=f
(1)×
z=f(
0)×z
×z=f
(0)×
z2,依次類推,而我們需要求的fib
(n
)fib(n)
fib(n)
實際上就是f(n
)f(n)
f(n)
第一項,也就是說,只要求得了f(n
)f(n)
f(n)
,就相當於求得了fib
(n
)fib(n)
fib(n)
,於是問題就轉換為了矩陣快速冪。
#include
using
namespace std;
int n;
const
int mod =
10000
;struct pp(
int a[3]
[3])
}}p operator*(
const p& a)
void
mod()}
;int te[3]
[3];
int one[3]
[3];
p qpow
(p temp,
int n)
n >>=1;
temp = temp * temp;
temp.
mod();
} ans.
mod();
return ans;
}int
main()
return0;
}
矩陣快速冪 斐波那契數列
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...
斐波那契數列 矩陣快速冪
輸入格式 輸入乙個正整數n 1 n 1e18 輸出格式 輸出乙個數,數列的第n項 輸入樣例1 1輸出樣例1 1輸入樣例2 3輸出樣例2 2 一 矩陣相乘 若a為n k矩陣,b為k m矩陣,則它們的乘積將是乙個n m矩陣。兩個矩陣能相乘的前提條件為前乙個矩陣的列數等於後乙個矩陣的行數。兩矩陣相乘的 如...