• Source
    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. #define MOD 1000000007;
    4.  
    5. int long long a,b,c,d;
    6.  
    7. void fast_fib(int long long n,int long long ans[])
    8. {
    9. if(n == 0){
    10. ans[0] = 0;
    11. ans[1] = 1;
    12. return;
    13. }
    14. fast_fib(n/2,ans);
    15.  
    16. a = ans[0]; // F(n)
    17. b = ans[1]; // F(n+1)
    18. c = 2*b - a; // [2*F(n+1) – F(n)]
    19.  
    20. c = (a * c) % MOD; // F(2n)
    21. d = (a*a + b*b) % MOD; // F(2n+1)
    22.  
    23. if(n%2 == 0){
    24. ans[0] = c;
    25. ans[1] = d;
    26. }
    27. else{
    28. ans[0] = d;
    29. ans[1] = c+d;
    30. }
    31.  
    32. }
    33.  
    34. int main()
    35. {
    36. long long int n; /* nth value to be found */
    37. scanf("%lld",&n);
    38. long long int ans[2]={0};
    39.  
    40. fast_fib(n,ans);
    41. printf("%lld\n", ans[0]);
    42.  
    43. return 0;
    44. }
    45.  
    46.  
    47.  
    48.  
    49.