forked from aman-agrawal/programs
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfibonacci_logn.cpp
More file actions
47 lines (34 loc) · 1002 Bytes
/
fibonacci_logn.cpp
File metadata and controls
47 lines (34 loc) · 1002 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class Solution {
public:
vector<vector<int>>a{{1,1},{1,0}};
vector<vector<int>> mul(vector<vector<int>>p,vector<vector<int>>q)
{
vector<vector<int>>r(2,vector<int>(2));
r[0][0]=p[0][0]*q[0][0] + p[0][1]*q[1][0];
r[0][1]=p[0][0]*q[0][1] + p[0][1]*q[1][1];
r[1][0]=p[1][0]*q[0][0] + p[1][1]*q[1][0];
r[1][1]=p[1][0]*q[0][1] + p[1][1]*q[1][1];
return r;
}
vector<vector<int>> foo(int n)
{
if(n==1)
return a;
vector<vector<int>>temp(2,vector<int>(2));
temp=foo(n/2);
temp=mul(temp,temp);
if(n%2==1)
temp=mul(temp,a);
return temp;
}
int fib(int N) {
if(N==0)
return 0;
if(N<3)
return 1;
vector<vector<int>>ans(2,vector<int>(2)) ;
N--;
ans= foo(N);
return ans[0][0];
}
};