Advertisement
Manioc

Fibo Log

Dec 26th, 2017
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.77 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define ll long long int
  3.  
  4. using namespace std;
  5. ll M[2][2] = {{1,1},{1,0}};
  6.  
  7. void mult(ll M[2][2], ll P[2][2]){
  8.     ll x = M[0][0]*P[0][0] + M[0][1]*P[1][0];
  9.     ll y = M[0][0]*P[0][1] + M[0][1]*P[1][1];
  10.     ll z = M[1][0]*P[0][0] + M[1][1]*P[1][0];
  11.     ll w = M[1][0]*P[0][1] + M[1][1]*P[1][1];
  12.  
  13.     M[0][0] = x;
  14.     M[0][1] = y;
  15.     M[1][0] = z;
  16.     M[1][1] = w;
  17. }
  18.  
  19. void exp(ll M[2][2], ll num){
  20.     if(num == 0 || num == 1) return;
  21.  
  22.     ll P[2][2] = {{1,1},{1,0}};
  23.  
  24.     exp(M, num/2);
  25.  
  26.     mult(M,M);
  27.     if(num%2 != 0) mult(M, P);
  28. }
  29.  
  30. ll fibo(ll num){
  31.     if(num == 0) return 0;
  32.  
  33.     exp(M, num-1);
  34.     return M[0][0];
  35. }
  36.  
  37. int main(){
  38.     ll num;
  39.     scanf("%lld", &num);
  40.     printf("%lld\n", fibo(num));
  41.     return 0;
  42. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement