pair f_helper(int n) // Returns pair of f(n) and f(n + 1) { if (n == 0) return make_pair(1, 1); if (n & 1) { pair res = f_helper(n - 1); swap(res.first, res.second); res.second += res.first; return res; } pair ans, res = f_helper(n / 2 - 1); ans.first = res.second * res.second + res.first * res.first; ans.second = res.second * (res.second + 2 * res.first); return ans; } int f(int n) { return f_helper(n).first; }