#include <stdio.h> void Matrix_Mutiply(int n, long a, long b,long c, long d, long *a1, long *b1, long *c1, long *d1) { long tempa,tempb, tempc,tempd; if (1 == n) { *a1 = a; *b1 = b; *c1 = c; *d1 = d; return; } else if ( (n & 0x01) == 0) { Matrix_Mutiply(n/2,a*a+b*c,a*b+b*d,a*c+c*d,b*c+d*d, a1,b1,c1,d1); return; } else { Matrix_Mutiply(n/2,a*a+b*c,a*b+b*d,a*c+c*d,b*c+d*d, &tempa,&tempb,&tempc,&tempd); *a1 = a * tempa + b * tempc; *b1 = a * tempb + b * tempd; *c1 = c * tempa + d * tempc; *d1 = c * tempb + d * tempd; return; } } long fib(int n) { long a, b,c, d; if ( n <= 2) return 1; Matrix_Mutiply(n-2,1L,1L,1L,0L,&a,&b,&c,&d); return a + b; } int main(void) { int iCnt; for (iCnt = 2; iCnt <= 30; ++iCnt) printf("%ld/n",fibonacci(iCnt)); return 0; }