#include <algorithm>
#include <cassert>
#include <cstring>
#include <iostream>
#include <vector>

#define TRACE(x) std::cout << #x << " = " << x << "\n"
#define _ << " _ " <<

using namespace std;
template <int32_t P>
struct ModInt_t {
  int32_t value;

  static_assert(P < (1 << 30) - 1, "2xP must fit into 32-bit signed integer");

  ModInt_t() : value{0} {};

  explicit ModInt_t(int32_t v) : value(v) {
    if (value >= P || value <= -P) value %= P;
    if (value < 0) value += P;
  };

  explicit operator bool() const { return value != 0; }
  explicit operator int32_t() const { return value; }

  ModInt_t& operator+=(const ModInt_t& other) {
    value += other.value;
    if (value >= P) value -= P;
    return *this;
  }

  ModInt_t& operator-=(const ModInt_t& other) {
    value -= other.value;
    if (value < 0) value += P;
    return *this;
  }

  ModInt_t& operator*=(const ModInt_t& other) {
    int64_t result = static_cast<int64_t>(value) * other.value;
    value = static_cast<int32_t>(result % P);
    return *this;
  }

  static ModInt_t inverse(ModInt_t x) { return ModInt_t{inverse(x.value)}; }

 private:
  static int32_t inverse(int32_t a) {
    int32_t b = P, x = 1, y = 0;
    while (b != 0) {
      auto k = a / b;
      a -= k * b;
      std::swap(a, b);
      x -= k * y;
      std::swap(x, y);
    }
    assert(a == 1);
    if (x < 0) x += P;
    return x;
  }
};

template <int32_t P>
ModInt_t<P> operator+(const ModInt_t<P>& a, const ModInt_t<P>& b) {
  auto res = a;
  return res += b;
};

template <int32_t P>
ModInt_t<P> operator-(const ModInt_t<P>& a, const ModInt_t<P>& b) {
  auto res = a;
  return res -= b;
};

template <int32_t P>
ModInt_t<P> operator*(const ModInt_t<P>& a, const ModInt_t<P>& b) {
  auto res = a;
  return res *= b;
};

template <int32_t P>
bool operator==(const ModInt_t<P>& a, const ModInt_t<P>& b) {
  return a.value == b.value;
};

template <int32_t P>
std::ostream& operator<<(std::ostream& os, const ModInt_t<P>& a) {
  os << a.value;
  return os;
}

template <typename T>
struct MulMonoid {
  using value_type = T;
  constexpr static T identity() { return T{1}; }
  constexpr static T op(const T& a, const T& b) { return a * b; }
};

template <typename T, typename U, typename Monoid = MulMonoid<T>>
T power(T a, U n) {
  T r{Monoid::identity()};
  while (n > 0) {
    if (n % 2) r = Monoid::op(r, a);
    a = Monoid::op(a, a);
    n /= 2;
  }
  return r;
}

using ModInt = ModInt_t<1000000007>;

const int MAX = 5050;

ModInt f[MAX][MAX][2];

ModInt solve(int N, int A, int B) {
  if (A > B) swap(A, B);
  // A <= B

  f[0][0][0] = ModInt{1};
  for (int i = 0; i <= N; ++i) {
    for (int c = 0; c <= B; ++c) {
      if (i == N) continue;

      if (c == B) {
        f[i + 1][c][0] += ModInt{2} * f[i][c][0];
        f[i + 1][c][1] += ModInt{2} * f[i][c][1];
        continue;
      }

      f[i + 1][c + 1][0] += f[i][c][0] + f[i][c][1];

      f[i + 1][c + 1][1] += f[i][c][1];

      f[i + 1][0][0] += f[i][c][0];

      if (i + A <= N && (i == 0 || c > 0)) {
        int rc = min(B, c + A);
        f[i + A][0][0] -= f[i][c][0];
        f[i + A][rc][1] += f[i][c][0];
      }
    }
  }
  return f[N][B][0] + f[N][B][1];
}

int main() {
  std::ios_base::sync_with_stdio(false);
  int N, A, B;
  cin >> N >> A >> B;

  auto ret = solve(N, A, B);
  cout << ret << "\n";
  return 0;
}


Measured memory_bytes: 202892