diff --git a/template.cpp b/template.cpp index 3ef5948..5046ffb 100644 --- a/template.cpp +++ b/template.cpp @@ -184,3 +184,25 @@ ll sum(ll i, ll bit[]){ } return ans; } + +Nth-fibonaaci-in-log-n + +#define long long long +const long M = 1000000007; // modulo +map F; +long f(long n) { + if (F.count(n)) return F[n]; + long k=n/2; + if (n%2==0) { // n=2*k + return F[n] = (f(k)*f(k) + f(k-1)*f(k-1)) % M; + } else { // n=2*k+1 + return F[n] = (f(k)*f(k+1) + f(k-1)*f(k)) % M; + } +} + +main(){ + long n; + F[0]=F[1]=1; + while (cin >> n) + cout << (n==0 ? 0 : f(n-1)) << endl; +}