qn是個特別可愛的小哥哥,qy是個特別好的小姐姐,他們兩個是一對好朋友 [ cp (劃掉~)
又是一年嚶花爛漫時,小qn於是就邀請了qy去嚶花盛開的地方去玩。當qy和qn來到了田野裡時,qy驚奇的發現,嚶花花瓣以肉眼可見的速度從樹上長了出來。
仔細看看的話,花瓣實際上是以一定規律長出來的,而且,每次張成新的花瓣的時候,上一次的花瓣就會都落到地上,而且不會消失。
花瓣生長的規律是,當次數大於等於2時,第i次長出來的花瓣個數和上一次張出來的花瓣個數的差是斐波那契數列的第i-1項。初始的時候地上沒有花瓣,樹上的花瓣個數為1,第一次生長的花瓣個數為1。初始的那個花瓣就落到了地上
現在,小qn想知道,經過k次生長之後,樹上和地上的總花瓣個數是多少?
ps:斐波那契數列:
f[1]=f[2]=1;f[i]=f[i-1]+f[i-2] (i>=2且i∈ n+)
輸入描述:
一行乙個數k
輸出描述:
一行乙個數m,表示第k次生長過後,樹上和地上的總花瓣數是多少。由於答案會很大,請你將答案mod 998244353後輸出
示例1輸入
4
輸出
12
說明 第一次:樹上1,地上1.第二次樹上2,地上1+1,第三次樹上3,地上1+1+2,第四次樹上5,地上1+1+2+3。總共12個示例2
輸入
5
輸出
20
說明 第五次樹上8,地上1+1+2+3+5。總共20個備註:
對於0%的資料,有k=樣例
對於20%的資料,有k<=1』000
對於60%的資料,有k<=1』000』000
對於80%的資料,有k<=1』000』000』000
對於100%的資料,有k<1』000』000』000』000』000』000
直接看地上的花,是乙個斐波那契數列之和,這時候可以使用矩陣的知識進行優化。(知識線性代數)
有些人對斐波那契數列為什麼要用矩陣來做,這裡給個例題:poj3073
我們都知道斐波那契數列後期速度以**速度遞增;所以運用了矩陣能夠防止超時(遞迴次數過多)。
base = [ 1 1 ] 去乘 f = [ f(n+1)]
______ [ 1 0 ] ________[ fn ]
注意:此處的下劃線僅用於調整版面位置。
相乘之後你會發現結果變成了
[ f(n+1)+fn ]
[ fn+1 ]
上面的就是我們需要的東西了;
錯誤思路:開始看乍一眼以為是斐波那契數列的累加,雖然用了矩陣進行優化結果只過了50%的資料。其實這種思路也沒錯,只不過資料有點苛刻
其實我們所需求的結果為pow(base, n + 3)-1(pow為第n位斐波那契數)
看來還是需要細心觀察呀!!!!
記得在演算法中間23行,要mod完全。
以下是常見的式子推導樣例:
1.f(n)=a* f(n-1)+b*f(n-2)+c;(a,b,c是常數)
2.f(n)=c^n-f(n-1) ;(c是常數)
#include
#include
using namespace std;
//const int maxn = 1e8 + 5;
#define ll long long
const ll mod =
998244353
;struct matrix
;//這裡的mul和pow還有matrix要結合起來用,矩陣快速冪,題目中是有mod的
matrix mul
(matrix &x, matrix &y)
}return c;
}ll pow
(matrix x, ll n)
return ans.a[0]
[1];
}int
main()
;while
(cin >> n && n !=-1
)return0;
}
又見斐波拉契(矩陣快速冪)
傳送門 2018年湘潭大學程式設計競賽 g 這是乙個加強版的斐波那契數列。給定遞推式 求f n 的值,由於這個值可能太大,請對 10 9 7 取模。第一行是乙個整數t 1 t 1000 表示樣例的個數。以後每個樣例一行,是乙個整數 n 1 n 10 18 每個樣例輸出一行,乙個整數,表示f n mo...
矩陣快速冪求斐波那契數列
求數a aa的n nn次冪,可以採用二分法進行快速計算,即 a n a cdot a n為偶數 a cdot a cdot a n為奇數 end right.an a n a a a cdot a cdot a cdot a cdots a a cdot a cdot a cdot a 2 cdot...
矩陣快速冪(求斐波那契數列)
矩陣快速冪求斐波那契數列的模板 因為fib n 至於最近的倆個序列有關 及fib n 1 和fib n 2 所以我們儲存最近的那倆個就行了。設f n 表示乙個1 2的矩陣,f n fib n fib n 1 可以看成 a,b a b,b 所以可以變成f n f n 1 a a表示乙個二維矩陣 a 2...