#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cassert>
#include <iostream>
#include <sstream>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <utility>
#include <numeric>
#include <algorithm>
#include <bitset>
#include <complex>
#include <array>
#include <list>
#include <stack>
#include <valarray>

using namespace std;

typedef unsigned uint;
typedef long long Int;
typedef unsigned long long UInt;

const int INF = 1001001001;
const Int INFLL = 1001001001001001001LL;

template<typename T> void pv(T a, T b) { for (T i = a; i != b; ++i) cout << *i << " "; cout << endl; }
template<typename T> void chmin(T& a, T b) { if (a > b) a = b; }
template<typename T> void chmax(T& a, T b) { if (a < b) a = b; }
int in() { int x; scanf("%d", &x); return x; }
double fin() { double x; scanf("%lf", &x); return x; }
Int lin() { Int x; scanf("%lld", &x); return x; }

int N, K;
Int memo[128][11111];

const Int MO = 1000000007;

Int powmod(Int x, int e) {
  Int v = 1;
  for (; e; e=e>>1, x=(x*x)%MO) {
    if (e&1) v=(v*x)%MO;
  }
  return v;
}

Int solve(int pos, int add) {
  if (pos < 0) return 0;
  if (memo[pos][add] >= 0) {
    return memo[pos][add];
  }
  Int& res = memo[pos][add];
  res = 0;

  for (int u = 0; u <= K; ++u) {
    if (u <= pos + 1) {
      int last = (u + add) % (pos + 1);
      int aa = (u + add) / (pos + 1);
      (res += solve(pos - 1, aa + add)) %= MO;
      (res += powmod(K + 1, pos) * last % MO) %= MO;
    } else {
      int last = (u + add);
      (res += solve(pos - 1, add)) %= MO;
      (res += powmod(K + 1, pos) * last % MO) %= MO;
    }
  }
  return res;
}

int main() {
  N = in();
  K = in();
  for (int i = 0; i < 128; ++i) {
    for (int j = 0; j < 11111; ++j) {
      memo[i][j] = -1;
    }
  }

  printf("%lld\n", solve(N - 1, 0));

  return 0;
}

### Prompt

Please formulate a cpp solution to the following problem:

Consider the following game:

* The game is played using a row of N squares and many stones.
* First, a_i stones are put in Square i\ (1 \leq i \leq N).
* A player can perform the following operation as many time as desired: "Select an integer i such that Square i contains exactly i stones. Remove all the stones from Square i, and add one stone to each of the i-1 squares from Square 1 to Square i-1."
* The final score of the player is the total number of the stones remaining in the squares.



For a sequence a of length N, let f(a) be the minimum score that can be obtained when the game is played on a.

Find the sum of f(a) over all sequences a of length N where each element is between 0 and K (inclusive). Since it can be extremely large, find the answer modulo 1000000007 (= 10^9+7).

Constraints

* 1 \leq N \leq 100
* 1 \leq K \leq N

Input

Input is given from Standard Input in the following format:


N K


Output

Print the sum of f(a) modulo 1000000007 (= 10^9+7).

Examples

Input

2 2


Output

10


Input

20 17


Output

983853488

### Response

```cpp
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cassert>
#include <iostream>
#include <sstream>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <utility>
#include <numeric>
#include <algorithm>
#include <bitset>
#include <complex>
#include <array>
#include <list>
#include <stack>
#include <valarray>

using namespace std;

typedef unsigned uint;
typedef long long Int;
typedef unsigned long long UInt;

const int INF = 1001001001;
const Int INFLL = 1001001001001001001LL;

template<typename T> void pv(T a, T b) { for (T i = a; i != b; ++i) cout << *i << " "; cout << endl; }
template<typename T> void chmin(T& a, T b) { if (a > b) a = b; }
template<typename T> void chmax(T& a, T b) { if (a < b) a = b; }
int in() { int x; scanf("%d", &x); return x; }
double fin() { double x; scanf("%lf", &x); return x; }
Int lin() { Int x; scanf("%lld", &x); return x; }

int N, K;
Int memo[128][11111];

const Int MO = 1000000007;

Int powmod(Int x, int e) {
  Int v = 1;
  for (; e; e=e>>1, x=(x*x)%MO) {
    if (e&1) v=(v*x)%MO;
  }
  return v;
}

Int solve(int pos, int add) {
  if (pos < 0) return 0;
  if (memo[pos][add] >= 0) {
    return memo[pos][add];
  }
  Int& res = memo[pos][add];
  res = 0;

  for (int u = 0; u <= K; ++u) {
    if (u <= pos + 1) {
      int last = (u + add) % (pos + 1);
      int aa = (u + add) / (pos + 1);
      (res += solve(pos - 1, aa + add)) %= MO;
      (res += powmod(K + 1, pos) * last % MO) %= MO;
    } else {
      int last = (u + add);
      (res += solve(pos - 1, add)) %= MO;
      (res += powmod(K + 1, pos) * last % MO) %= MO;
    }
  }
  return res;
}

int main() {
  N = in();
  K = in();
  for (int i = 0; i < 128; ++i) {
    for (int j = 0; j < 11111; ++j) {
      memo[i][j] = -1;
    }
  }

  printf("%lld\n", solve(N - 1, 0));

  return 0;
}

```