// https://cf17-final.contest.atcoder.jp/tasks/cf17_final_e
#include<iostream>
#include<vector>
#include<unordered_map>

#ifdef _GLIBCXX_DEBUG
#define cin cin_
#include<sstream>
namespace std{std::stringstream cin(R"(
20 17
)");}
#endif

int k; // maximum value of an element
int MOD=1000000007;
std::vector<int> kp1_xp;

std::vector<std::unordered_map<int,int>> g_mem;
int g(int p,int e){
	if(p==1){
		return (
			// if a[1]==0
			e +
			// if a[1]==1
			(e+1)
		)%MOD;
	}

	auto it=g_mem[p].find(e);
	if(it!=g_mem[p].end())return it->second;

	int ans=0;
	for(int i=0;i<=k;++i){
		// i = a[p]
		if(i>p){
			ans=(ans+g(p-1,e))%MOD; // this can be optimized?
		}else{
			int nStep=(i+e)/p;
			ans=(ans+g(p-1,e+nStep)+nStep*(int64_t)kp1_xp[p-1])%MOD;
		}
	}

	g_mem[p].emplace(e,ans);
	return ans;
}

int main(){
	std::ios::sync_with_stdio(false);std::cin.tie(nullptr);
	int n;std::cin>>n>>k;

	// init kp1_xp (kp1_xp[x] = (k+1)**x %MOD)
	kp1_xp.resize(n+1);
	kp1_xp[0]=1;
	for(int i=1;i<=n;++i)
		kp1_xp[i]=int64_t(k+1)*kp1_xp[i-1]%MOD;

	int sum_all=k*int64_t(k+1)/2 %MOD *kp1_xp[n-1] %MOD *n %MOD;
	// avg each position: k/2, n. of seq: (k+1)**n, n. of pos: n

	g_mem.resize(n+1);
	std::cout<<(sum_all+MOD-g(n,0))%MOD<<std::endl;
}
