Advertisement
hkshakib

Untitled

Jul 31st, 2019
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.83 KB | None | 0 0
  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;
  37. scanf("%lld",&n);
  38. long long int ans[2]={0};
  39. fast_fib(n,ans);
  40. printf("%lld\n", ans[0]);
  41.  
  42. return 0;
  43. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement