問題描述
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。輸出格式 輸出一行,...