Advertisement
printesoi

Fibonacci

Jun 12th, 2011
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 0.99 KB | None | 0 0
  1. #include    <stdio.h>
  2. #include    <stdlib.h>
  3.  
  4. void mult_matrice(long long a[][2],long long b[][2],long long c[][2])
  5. {
  6.     int i,j,k;
  7.     for (i=0;i<2;++i)
  8.         for (j=0;j<2;++j){
  9.             c[i][j]=0;
  10.             for (k=0;k<2;++k)
  11.                 c[i][j]=(c[i][j]+1LL*a[i][k]*b[k][j]);
  12.         }
  13. }
  14.  
  15. void set ( long long mat[][2],int k )
  16. {
  17.     mat[0][0]=mat[0][1]=mat[1][0]=mat[1][1]=k;
  18. }
  19.  
  20. void copy( long long dest[][2],long long src[][2])
  21. {
  22.     int i,j;
  23.     for (i=0;i<2;i++)
  24.         for (j=0;j<2;j++)
  25.             dest[i][j]=src[i][j];
  26. }
  27.  
  28. void fibonacci(int n,long long f[][2],long long sol[][2])
  29. {
  30.     long long aux[2][2];
  31.     set(sol,0);
  32.     sol[0][0]=sol[1][1]=1;
  33.  
  34.     while (n){
  35.         if (n&1){
  36.             set(aux,0);
  37.             mult_matrice(sol,f,aux);
  38.             copy(sol,aux);
  39.         }
  40.         set(aux,0);
  41.         mult_matrice(f,f,aux);
  42.         copy(f,aux);
  43.         n>>=1;
  44.     }
  45.  
  46. }
  47.  
  48. int main ()
  49. {
  50.     long long f[2][2],sol[2][2];
  51.     int i,j,n;
  52.     scanf("%d",&n);
  53.     for (i=0;i<2;++i)
  54.         for (j=0;j<2;++j)
  55.             f[i][j]=i||j;
  56.  
  57.     fibonacci(n-1,f,sol);
  58.     printf("%lld\n",sol[1][1]);
  59.     return EXIT_SUCCESS;
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement