我想解決這個問題: SPOJ problem。查找第n個fib數,在O(logn)
經過一番研究,但是我發現它歸結爲第n個FIB數量的簡單計算,正可以得到真正的大,以便爲O(n)解決方案將沒有任何好處。周圍的Googling我發現,你可以計算出O(LOGN)第n FIB數量,也是一個代碼示例,正是這麼做的:
long long fibonacci(int n)
{
long long fib[2][2]= {{1,1},{1,0}},ret[2][2]= {{1,0},{0,1}},tmp[2][2]= {{0,0},{0,0}};
int i,j,k;
while(n)
{
if(n&1)
{
memset(tmp,0,sizeof tmp);
for(i=0; i<2; i++) for(j=0; j<2; j++) for(k=0; k<2; k++)
tmp[i][j]=(tmp[i][j]+ret[i][k]*fib[k][j]);
for(i=0; i<2; i++) for(j=0; j<2; j++) ret[i][j]=tmp[i][j];
}
memset(tmp,0,sizeof tmp);
for(i=0; i<2; i++) for(j=0; j<2; j++) for(k=0; k<2; k++)
tmp[i][j]=(tmp[i][j]+fib[i][k]*fib[k][j]);
for(i=0; i<2; i++) for(j=0; j<2; j++) fib[i][j]=tmp[i][j];
n/=2;
}
return (ret[0][1]);
}
我試圖修改它的問題,我仍然獲得WA:http://ideone.com/3TtE5m
我在計算模運算錯誤嗎?或者是其他問題?
Fibbonacci或prime? – EvgeniyZh
對於SPOJ問題,使用fib(n + 1),除了n = 0之外,我不確定0個硬幣是否計數爲1。請注意(x%12345678901)* y(%12345678901)可能需要多達68位。在64位模式下,可以實現基於彙編的函數來乘以模數12345678901,因爲乘除之前的乘數和除數可以是128位。 – rcgldr