#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define SZ(x) ((int)x.size())
#define L(i,u) for (register int i=head[u]; i; i=nxt[i])
#define rep(i,a,b) for (register int i=(a); i<=(b); i++)
#define per(i,a,b) for (register int i=(a); i>=(b); i--)
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef pair<int,int> Pii;
typedef vector<int> Vi;
template<class T> inline void read(T &x){
	x=0; char c=getchar(); int f=1;
	while (!isdigit(c)) {if (c=='-') f=-1; c=getchar();}
	while (isdigit(c)) {x=x*10+c-'0'; c=getchar();} x*=f;
}
template<class T> inline void umin(T &x, T y){x=x<y?x:y;}
template<class T> inline void umax(T &x, T y){x=x>y?x:y;}
inline ui R() {
	static ui seed=416;
	return seed^=seed>>5,seed^=seed<<17,seed^=seed>>13;
}
const int N = 105,mo=1e9+7;
inline void add(int &x, int y){x=x+y<mo?x+y:x+y-mo;}
int n,k,f[N][N*N],mx;
int main() {
	read(n);read(k);f[n+1][0]=1;
	per(i,n,1)mx+=1+mx/i;mx+=10;
	per(i,n,1)rep(j,0,mx)if(f[i+1][j]){
		if(i<=k)f[i][j]=(f[i][j]+1LL*f[i+1][j]*(k-i))%mo;
		rep(x,0,min(i,k))add(f[i][j+(x+j)/i],f[i+1][j]);
	}
	int res=1LL*k*(k+1)/2*n%mo;rep(i,1,n-1)res=1LL*res*(k+1)%mo;
	rep(j,0,mx)res=(res-1LL*f[1][j]*j)%mo;
//	rep(j,0,mx)if(f[1][j])printf("%d:%d\n",j,f[1][j]);
	res=(res%mo+mo)%mo;cout<<res;
	return 0;
}
