輸入格式:
輸入乙個正整數n (1<=n<=1e18)。
輸出格式:
輸出乙個數,數列的第n項
輸入樣例1:
1輸出樣例1:
1輸入樣例2:
3輸出樣例2:2**
一 矩陣相乘
若a為n×k矩陣,b為k×m矩陣,則它們的乘積將是乙個n×m矩陣。兩個矩陣能相乘的前提條件為前乙個矩陣的列數等於後乙個矩陣的行數。
兩矩陣相乘的**如下
for
(int i=
0;i)}
二 快速冪普通快速冪的方法為:求a^n,(n特別大的時候),用二分法
先看小一點的,a的9次方
a^9= aaaaaaaaa 【乙個乙個乘,要乘9次】
= a*(aa)(aa)(aa)(a*a)
= a*(a2)4 【a平方後,再四次方,還要乘上剩下的乙個a,要乘6次】
= a*((a2)2)^2【a平方後,再平方,再平方,還要乘上剩下的乙個a,要乘4次】
所以如果n為100000000時,運用快速冪只需要乘log2^n。
**如下
int res=
1while
(n>0)
return res;
矩陣快速冪只需把res換成單位矩陣,a換成對應的矩陣即可。
下面上**
struct matrix
;//結構體 矩陣。
struct matrix qul
(unsigned
long
long t,
struct matrix a)
return res;
}
重點!!!!斐波那契數列與矩陣的關係!!!
但要注意,若n>=3,即斐波那契數列是從f1開始的則上面的n-1要改為n-2。若從f0開始則為n-1
所以若求第n項,則求出上述矩陣的n次冪即可,然後將得到的新矩陣的第一行相加即為第n項的值
完整**如下
#include
#include
#define max 998244353
struct matrix
;//結構體 矩陣。
struct matrix mul
(struct matrix a,
struct matrix b)
//矩陣相乘,返回值為矩陣 }}
return c;
}//快速冪
struct matrix qul
(unsigned
long
long t,
struct matrix a)
return res;
}int
main()
return0;
}
**
注意:本題中n的值過大所以需要用到快速冪矩陣,切要對結果取模,否則會出錯
矩陣快速冪 斐波那契數列
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...
矩陣快速冪求斐波那契數列
求數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...