Problem p03849 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>

using namespace std;
using int64 = long long;

constexpr int DEBUG = 0;

constexpr int64 P = 1000000007;

struct FiniteField {
private:
  int64 x;
  static inline int64 Normalize(int64 x) {
    if (0 <= x && x < P)
      return x;
    x %= P;
    if (x < 0)
      x += P;
    return x;
  }

public:
  FiniteField(int64 x) : x(Normalize(x)) {}
  FiniteField() : x(0) {}
  int64 Value() const { return x; }
  inline FiniteField operator+(FiniteField o) const {
    FiniteField r(*this);
    r += o;
    return r;
  }
  inline FiniteField operator-(FiniteField o) const {
    FiniteField r(*this);
    r -= o;
    return r;
  }
  inline FiniteField operator*(FiniteField o) const {
    FiniteField r(*this);
    r *= o;
    return r;
  }
  inline FiniteField operator/(FiniteField o) const {
    FiniteField r(*this);
    r /= o;
    return r;
  }
  inline void operator+=(FiniteField o) { x = (x + o.x) % P; }
  inline void operator-=(FiniteField o) { x = (x + P - o.x) % P; }
  inline void operator*=(FiniteField o) { x = (x * o.x) % P; }
  void operator/=(FiniteField o) {
    int64 p = P - 2;
    while (p) {
      if (p % 2) {
        *this *= o;
      }
      o *= o;
      p /= 2;
    }
  }
};

ostream &operator<<(ostream &s, const FiniteField &v) {
  s << v.Value();
  return s;
}

FiniteField Power(FiniteField x, int p) {
  if (p < 0)
    return FiniteField(1) / Power(x, -p);
  FiniteField value = 1;
  while (p) {
    if (p % 2)
      value *= x;
    x *= x;
    p /= 2;
  }
  return value;
}

template <typename T>
vector<vector<vector<T>>> Make3DVector(int d1, int d2, int d3,
                                       T default_value) {
  return vector<vector<vector<T>>>(
      d1, vector<vector<T>>(d2, vector<T>(d3, default_value)));
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);

  int64 n;
  cin >> n;

  map<int, FiniteField> dp;
  function<FiniteField(int)> solve_dp_fn = [&](int x) -> FiniteField {
    if (dp.find(x) != dp.end()) {
      return dp[x];
    }
    if (x == 0)
      return 1;
    if (x == 1)
      return 2;
    auto v = solve_dp_fn((x - 2) / 2) + solve_dp_fn((x - 1) / 2) +
             solve_dp_fn(x / 2);
    dp[x] = v;
    return v;
  };
  cout << solve_dp_fn(n) << endl;
  // cout << ans << endl;
}

Fixed submission:
#include <bits/stdc++.h>

using namespace std;
using int64 = long long;

constexpr int DEBUG = 0;

constexpr int64 P = 1000000007;

struct FiniteField {
private:
  int64 x;
  static inline int64 Normalize(int64 x) {
    if (0 <= x && x < P)
      return x;
    x %= P;
    if (x < 0)
      x += P;
    return x;
  }

public:
  FiniteField(int64 x) : x(Normalize(x)) {}
  FiniteField() : x(0) {}
  int64 Value() const { return x; }
  inline FiniteField operator+(FiniteField o) const {
    FiniteField r(*this);
    r += o;
    return r;
  }
  inline FiniteField operator-(FiniteField o) const {
    FiniteField r(*this);
    r -= o;
    return r;
  }
  inline FiniteField operator*(FiniteField o) const {
    FiniteField r(*this);
    r *= o;
    return r;
  }
  inline FiniteField operator/(FiniteField o) const {
    FiniteField r(*this);
    r /= o;
    return r;
  }
  inline void operator+=(FiniteField o) { x = (x + o.x) % P; }
  inline void operator-=(FiniteField o) { x = (x + P - o.x) % P; }
  inline void operator*=(FiniteField o) { x = (x * o.x) % P; }
  void operator/=(FiniteField o) {
    int64 p = P - 2;
    while (p) {
      if (p % 2) {
        *this *= o;
      }
      o *= o;
      p /= 2;
    }
  }
};

ostream &operator<<(ostream &s, const FiniteField &v) {
  s << v.Value();
  return s;
}

FiniteField Power(FiniteField x, int p) {
  if (p < 0)
    return FiniteField(1) / Power(x, -p);
  FiniteField value = 1;
  while (p) {
    if (p % 2)
      value *= x;
    x *= x;
    p /= 2;
  }
  return value;
}

template <typename T>
vector<vector<vector<T>>> Make3DVector(int d1, int d2, int d3,
                                       T default_value) {
  return vector<vector<vector<T>>>(
      d1, vector<vector<T>>(d2, vector<T>(d3, default_value)));
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);

  int64 n;
  cin >> n;

  map<int64, FiniteField> dp;
  function<FiniteField(int64)> solve_dp_fn = [&](int64 x) -> FiniteField {
    if (dp.find(x) != dp.end()) {
      return dp[x];
    }
    if (x == 0)
      return 1;
    if (x == 1)
      return 2;
    auto v = solve_dp_fn((x - 2) / 2) + solve_dp_fn((x - 1) / 2) +
             solve_dp_fn(x / 2);
    dp[x] = v;
    return v;
  };
  cout << solve_dp_fn(n) << endl;
  // cout << ans << endl;
}