O(logn) code for computing fib(n)
Reference: http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-11.html#%_thm_1.19
#include long int fib( long int n) { long int a=1, b=0, p=0, q=1, prev_a, prev_p = 0; while (n>0) { if (n%2 == 0) { prev_p = p; p = p*p + q*q; q = 2*prev_p*q + q*q; n /= 2; } else { prev_a = a; a = b*q + a*q + a*p; b = b*p + prev_a*q; n -= 1; } } return b; } int main( int argc, char **argv) { long int n; scanf ( "%ld" , &n); printf ( "%ld" , fib(n)); return 0; } |