入門訓練 Fibonacci數列

2021-07-29 23:47:17 字數 1372 閱讀 5330

問題描述

fibonacci數列的遞推公式為:fn=fn-1+fn-2,其中f1=f2=1。當n比較大時,fn也非常大,現在我們想知道,fn除以10007的餘數是多少。

輸入格式

輸入包含乙個整數n。

輸出格式

輸出一行,包含乙個整數,表示fn除以10007的餘數。

說明:在本題中,答案是要求fn除以10007的餘數,因此我們只要能算出這個餘數即可,而不需要先計算出fn的準確值,再將計算的結果除以10007取餘數,直接計算餘數往往比先算出原數再取餘簡單。

樣例輸入10

樣例輸出55

樣例輸入22

樣例輸出7704

資料規模與約定1 <= n <= 1,000,000。

對於這道題,由於資料較大,所以用遞迴或者for迴圈,肯定會超時的.網上有很多優化的遞迴辦法這裡就不寫了。這裡提供一種快速的矩陣快速冪解決辦法。在存在遞推和形如 fibonacci數列的式子的時候可以直接拿來用。只要會夠造矩陣,使用矩陣快速冪就不是問題。

f[n-2],f[n-1]]*a = [f[n-1],f[n]]怎樣構造a呢?

首先構造f[n-1].通過等式左邊的式子可以觀察到f[n-2]*0+f[n-1]*1=f[n-1],所以二維矩陣a的第0列元素為(0 1)。由於f[n]=f[n-2]+f[n-1]得f[n]=f[n-2]*1+f[n-1]*1這樣就得到就矩陣的第二列元素(1,1)。這樣就構造好了矩陣a既**main中的temp。

#include

#include

unsigned

long

long

int n;

struct fib;

fib multiply(fib x, fib y)}}

return temp;

}int main(void);//[f[n-2],f[n-1]]*a = [f[n-1],f[n]]從這個式子我們可以構造出a既temp

fib ans;

long

long f[2]=,sum=0;

scanf("%llu",&n);

memset(ans.a,0,sizeof(ans.a));

for(i=0;i<2;i++)

if(n==1 || n==2)

n=n-2;

while(n)

n= n>> 1;

temp=multiply(temp,temp);

}for(i=0;i<2;i++)

printf("%d",sum);

return

0;}

入門訓練 Fibonacci數列

入門訓練 fibonacci數列 時間限制 1.0s 記憶體限制 256.0mb 問題描述 fibonacci數列的遞推公式為 fn fn 1 fn 2,其中f1 f2 1。當n比較大時,fn也非常大,現在我們想知道,fn除以10007的餘數是多少。輸入格式 輸入包含乙個整數n。輸出格式 輸出一行,...

入門訓練 Fibonacci數列

入門訓練 fibonacci數列 時間限制 1.0s 記憶體限制 256.0mb 問題描述 fibonacci 數列的遞推公式為 fn f n 1 f n 2,其中f1 f 2 1。當n比較大時,fn 也非常大,現在我們想知道,f n除以10007的餘數是多少。輸入格式 輸入包含乙個整數n。輸出格式...

入門訓練 Fibonacci數列

入門訓練 fibonacci數列 時間限制 1.0s 記憶體限制 256.0mb 問題描述 fibonacci數列的遞推公式為 fn fn 1 fn 2,其中f1 f2 1。當n比較大時,fn也非常大,現在我們想知道,fn除以10007的餘數是多少。輸入格式 輸入包含乙個整數n。輸出格式 輸出一行,...