#include <bits/stdc++.h>
using namespace std;
namespace Flandre_Scarlet {
class Matrix {
 private:
  long long a[110][110];

 public:
  long long n;
  Matrix() {
    memset(a, 0, sizeof(a));
    n = 0;
  }
  Matrix(long long _n) {
    memset(a, 0, sizeof(a));
    n = _n;
  }
  Matrix(long long _n, long long _x) {
    _x %= ((long long)1e9 + 7);
    n = _n;
    for (long long i = 0; i < 110; ++i) {
      for (long long j = 0; j < 110; ++j) {
        a[i][j] = _x;
      }
    }
  }
  long long* operator[](long long i) { return *(a + i); }
  void Set(long long x) {
    x %= ((long long)1e9 + 7);
    for (long long i = 0; i < 110; ++i) {
      for (long long j = 0; j < 110; ++j) {
        a[i][j] = x;
      }
    }
  }
  void Identity() {
    memset(a, 0, sizeof(a));
    for (long long i = 0; i < 110; ++i) {
      a[i][i] = 1;
    }
  }
};
Matrix operator*(Matrix x, Matrix y) {
  Matrix ans(x.n, 0);
  long long n = ans.n;
  for (long long i = 1; i <= n; ++i)
    for (long long j = 1; j <= n; ++j) {
      if (x[i][j]) {
        for (long long k = 1; k <= n; ++k) {
          ans[i][k] += x[i][j] * y[j][k] % ((long long)1e9 + 7);
          if (ans[i][k] >= ((long long)1e9 + 7))
            ans[i][k] -= ((long long)1e9 + 7);
        }
      }
    }
  return ans;
}
Matrix operator^(Matrix x, long long p) {
  Matrix ans(x.n, 1);
  ans.Identity();
  while (p) {
    if (p & 1) ans = ans * x;
    x = x * x, p >>= 1;
  }
  return ans;
}
long long n, m;
void Input() { cin >> n >> m; }
void Soviet() {
  if (n < m) {
    puts("1");
    return;
  }
  Matrix Trans(m, 0);
  Matrix Init(m, 0);
  for (long long i = 2; i <= m; ++i) {
    Init[i][1] = 1;
  }
  Init[1][1] = 2;
  Trans[1][1] = Trans[1][m] = 1;
  for (long long i = 2; i <= m; ++i) Trans[i][i - 1] = 1;
  Matrix Answer = (Trans ^ (n - m)) * Init;
  printf("%lld\n", Answer[1][1]);
}
void IsMyWife() {
  Input();
  Soviet();
}
}  // namespace Flandre_Scarlet
int main() {
  Flandre_Scarlet::IsMyWife();
  getchar();
  getchar();
  return 0;
}
