#include <cstdio>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <cstring>
#include <string>
#include <cmath>
#include <cstdlib>
#include <iostream>

using namespace std;

#define MOD 1000000007
#define ADD(X,Y) ((X) = ((X) + (Y)) % MOD)
typedef long long i64; typedef vector<int> ivec; typedef vector<string> svec;

const int P = 4000;

int N, K;
pair<i64, i64> dp[110][P]; // cnt, profit

void add(pair<i64, i64> &a, i64 ct, i64 pf)
{
	a = make_pair((a.first + ct) % MOD, (a.second + pf) % MOD);
}

int main()
{
	scanf("%d%d", &N, &K);

	for (int i = 0; i <= N; ++i) {
		for (int j = 0; j < P; ++j) {
			dp[i][j] = make_pair(0LL, 0LL);
		}
	}
	dp[N][0] = make_pair(1LL, 0LL);
	for (int i = N; i >= 1; --i) {
		for (int j = 0; j < P; ++j) {
			if (dp[i][j] == make_pair(0LL, 0LL)) continue;

			for (int k = 0; k <= K; ++k) {
				if (k > i) { // too large
					add(dp[i - 1][j], dp[i][j].first, dp[i][j].second);
				} else {
					int chg = k + j;
					int j2 = j + chg / i;
					add(dp[i - 1][j2], dp[i][j].first, dp[i][j].second + dp[i][j].first * chg);
				}
			}
		}
	}
	i64 ret = 0;
	for (int i = 0; i < P; ++i) {
		ADD(ret, dp[0][i].first * i);
	//	printf("%d %lld %lld\n", i, dp[0][i].first, dp[0][i].second);
	}

	i64 base = K * (K + 1) / 2;
	for (int i = 0; i < N - 1; ++i) base = base * (K + 1) % MOD;
	base = base * N % MOD;

	printf("%lld\n", (base + MOD - ret) % MOD);

	return 0;
}
