• 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太大
怎麼辦呢?
我前面寫過乙個矩陣快速冪的板子,大家應該看過。
那麼,這裡我們就要用矩陣快速冪來優化
我們將原數列抽象為這樣的乙個矩陣:
那麼,我們將原矩陣乘上這樣的乙個矩陣:
就變成了這樣:
整個矩陣向著斐波那契的下一項方向移動
ok,現在我們就不用o(n)地移動了,o(logn)即可
(關於矩陣快速冪部分,請參見我以前的一篇部落格(上面有鏈結))
#include#include#include
#define rii register int i
#define rij register int j
#define rik register int k
#define mod 1000000007
using
namespace
std;
struct
jx,y,z,an;
long
long
n;long
long ys[5
];inline j cheng(j l,j r)
ltt.jz[i][j]=ans;}}
return
ltt;
}j pw(j k,
long
long
c)
if(c%2==0
)
else
}int
main()
if(n==2
)
pw(x,n-2
); an=cheng(y,an);
cout
<1][1
];}
矩陣加速遞推(XDU 斐波那契數列為列)
這是xdu校網路塞的一道題目,斐波那契數列。看到給出的資料那麼大,心想,既然給出了mod,說不定有乙個迴圈節呢,可是直到n達到10 6都還沒有出現迴圈節,只有放棄了,然後覺得可以解線性遞推式的特徵根來求解,簡單化了幾下,感覺不妥,然後放棄了。後來白神說,這題可以用矩陣加速,感謝白神又讓我a了一題。啥...
矩陣 斐波那契數列
利用矩陣來求解斐波那契數列的有關問題是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。輸出格式 每行輸出乙個非負整數表示答案。矩陣加速裸題 和我的前一篇基本一模一樣 只不過改變了要乘的...