#include <set>
#include <map>
#include <cmath>
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

#define pb push_back
#define mp make_pair
#define x first
#define y second

typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<pii> vpii;

template <class T>
void read(T &x)
{
	char ch;
	for (ch=getchar();(ch<'0'||ch>'9')&&ch!='-';) ch=getchar();
	x=0;int t=1;if (ch=='-') {ch=getchar();t=-1;}
	for (;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
	x*=t;
}

const int mod=1000000007;
int dp[4010],dp2[4010],fac[4010];

int main()
{
	#ifndef ONLINE_JUDGE
		//freopen("input.txt","r",stdin);
		//freopen("output.txt","w",stdout);
	#endif
	int n,k;scanf("%d%d",&n,&k);
	int ans=1;
	for (int i=1;i<n;i++) ans=ll(ans)*(k+1)%mod;
	ans=ll(ans)*(k*(k+1)/2)%mod;ans=ll(ans)*n%mod;
	memset(dp,0,sizeof(dp));dp[0]=min(k+1,n);dp[1]=(k==n);
	fac[0]=1;for (int i=1;i<=n;i++) fac[i]=ll(fac[i-1])*(k+1)%mod;
	ans=((-ll(fac[n-1])*dp[1]+ans)%mod+mod)%mod;
	for (int i=n-1;i;i--)
	{
		for (int j=0;j<=4000;j++) dp2[j]=dp[j];
		memset(dp,0,sizeof(dp));
		for (int j=0;j<=4000;j++)
			if (dp2[j])
				for (int p=0;p<=k;p++)
				{
					if (p>i) {dp[j]=(dp[j]+dp2[j])%mod;continue;}
					int t=(p+j)/i;ans=((-ll(fac[i-1])*t%mod*dp2[j]+ans)%mod+mod)%mod;
					dp[t+j]=(dp[t+j]+dp2[j])%mod;
				}
	}
	printf("%d\n",ans);
	return 0;
}

