Fibonacci數列的冪和

2021-06-21 10:21:32 字數 1684 閱讀 1786

題目:

題意:給定

分析:嗯,這道題貌似有難度,如果

以前我們做乙個大fibonacci數列模乙個大素數都是用矩陣,當然這裡素數滿足條件:5是模這個素數的二

次剩餘,那麼現在要求不要用矩陣來計算這個結果呢?那就是今天我要討論的問題,本題也是基於這種思路。

本題我們可以直接

利用fibonacci數列的公式進行計算。因為我們知道fibonacci數列的公式為:

雖然公式中含有根號,但是我們知道

和二次剩餘的轉化來做。比如

為了方便表示,我們令:

那麼得到

對於每乙個

所以到了這裡本題就明確了,列舉每乙個0

當然對於

可以看出本題條件好在1000000009是素數,而且5是模1000000009的二次剩餘。

經計算2模1000000009的逆元是500000005,而383008016

也就是說對於

同理,對於

嗯,貌似還有乙個問題沒有處理,t = 1時咋辦? 這個很簡單啦,不用等比求和公式即可。其實吧,這裡面

我們還可以注意到

**:

#include #include #include using namespace std;

typedef long long ll;

const int n = 100005;

const ll mod = 1000000009;

ll fac[n],a[n],b[n];

void init()

return ans;

}ll solve(ll n,ll k)

ll m = quick_mod(383008016,mod-2,mod);

ans = ans * quick_mod(m,k,mod) % mod;

ans = (ans % mod + mod) % mod;

return ans;

}int main()

{ int t;

ll n,k;

init();

scanf("%d",&t);

while(t--)

{cin>>n>>k;

cout<

fibonacci數列矩陣快速冪

對於矩陣 1 1 1 0 的n次冪,第一行第二個元素 右上角 的元素即為fibonacci數列的第n項,由此可以根據矩陣的乘法計算fibonacci數列的元素值 矩陣的快速冪利用的也是冪乘的二分法,只不是換成了矩陣的乘法,可以用函式處理。可以定義乙個二維陣列的結構體 typedef struct m...

fibonacci 數列的快速冪求法

fibonacci數列的經典解法,即遞迴解法,如下 int fib int n 是十分簡潔,但有乙個問題,即重複求解子問題,複雜度以 n 的指數方式遞增。改進的做法是避免掉重複計算,複雜度可優化到o n 如下 int fib int n return sum 該方法依賴於這樣乙個事實 即轉化為矩陣求...

Fibonacci數列(矩陣乘法快速冪)

題目描述 定義 f0 f1 1,fn fn 1 fn 2 n 2 稱為fibonacci數列。輸入n,求fn mod q。其中1 q 30000。輸入描述 第一行乙個數t 1 t 10000 以下t行,每行兩個數,n,q n 109,1 q 30000 輸出描述 檔案包含t行,每行對應乙個答案。樣例...