這是xdu校網路塞的一道題目,斐波那契數列。。。看到給出的資料那麼大,心想,既然給出了mod,說不定有乙個迴圈節呢,可是直到n達到10^6都還沒有出現迴圈節,只有放棄了,然後覺得可以解線性遞推式的特徵根來求解,簡單化了幾下,感覺不妥,然後放棄了。後來白神說,這題可以用矩陣加速,感謝白神又讓我a了一題。啥?什麼叫矩陣加速呢?請戳這裡:
演算法學習筆記 遞迴之 快速冪、斐波那契矩陣加速
原來,線性遞推式可以換成矩陣相乘的形式,然後得到乙個關於乙個常矩陣的冪的形式。之後就得用類似於快速冪的思想解題了(看過,但沒寫過,感覺沒啥大的用處,真是。。。)。
對於此題:我們可以得到乙個矩陣遞推式,常量矩陣見**(不好打)。
**:#include#include#include#define ll long long
#define mod 1000000007
using namespace std;
int n;
ll a[2][2]=;//上面所說的常矩陣
void cal_2(ll a[2][2],ll b[2][2],ll c[2][2])
}void cal_1(ll a[2][2],int n)
ll t[2][2];
cal_1(t,n/2);//遞迴處理
cal_2(t,t,a);//計算連個矩陣的乘積
if(n&1) cal_2(a,a,t),memcpy(a,t,sizeof(t));//讓我對快速冪取模的理解又加深了一點
}int main(){
while(scanf("%d",&n)==1){
ll ans[2][2];
if(n<2){cout<
斐波那契數列(矩陣加速遞推)
f 1 1 f 2 1 f n f n 1 f n 2 n 2 且 n 為整數 請你求出 f n mod 1000000007 的值。輸入格式 第 1 行 乙個整數 n 輸出格式 第 1 行 f n mod 1000000007 的值 n 1e18 我們已經知道遞推公式了,但有個問題,就是n太大 怎...
矩陣 斐波那契數列
利用矩陣來求解斐波那契數列的有關問題是acm題中乙個比較常見的題型。例 nyoj 148 斐波那契數列2 有關斐波那契樹列的規律詳見這裡。1 對於n 1,都有f n 與f n 1 互質。2 f n f i f n i 1 f i 1 f n i 現在說說怎麼利用矩陣來求解斐波那契數列。我們可以先儲存...
模板 矩陣加速(數列)(矩陣加速遞推)
a 1 a 2 a 3 1 a x a x 3 a x 1 x 3 求a數列的第n項對1000000007 10 9 7 取餘的值。輸入格式 第一行乙個整數t,表示詢問個數。以下t行,每行乙個正整數n。輸出格式 每行輸出乙個非負整數表示答案。矩陣加速裸題 和我的前一篇基本一模一樣 只不過改變了要乘的...