//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx")
//#pragma GCC target("avx,tune=native")
#include<bits/stdc++.h>
#define int long long
//#include<ext/pb_ds/assoc_container.hpp>
using namespace std;
//using namespace __gnu_pbds;
const int inf=0x3f3f3f3f;
const double eps=1e-6;
const int mod=1000000007;
typedef long long ll;
#define eprintf(...) fprintf(stderr, __VA_ARGS__)
inline string getstr(string &s,int l,int r){string ret="";for(int i=l;i<=r;i++)ret.push_back(s[i]);return ret;}
int modpow(int x,int y,int md=mod){if(y==0)return 1;int ret=modpow(x,y>>1,md);ret=(ll)ret*ret%md;if(y&1)ret=(ll)ret*x%md;return ret;}
int n,k;
inline int inv(int x){
	return modpow(x,mod-2,mod);
}
int dp[105][205*105];
int sum;
inline void add(int &x,int y){
	(x+=y)%=mod; 
}
inline void sub(int &x,int y){
	(x-=y)%=mod;(x+=mod)%=mod;
}
signed main(){
	cin>>n>>k;
	sum=n*modpow(k+1,n-1,mod)%mod*k%mod*(k+1)%mod*inv(2)%mod;
	dp[k+1][0]=1;
	for(int i=k+1;i>1;i--){
		for(int j=0;j<=200*100;j++){
			for(int v=0;v<=k;v++){
				if(v>i-1)add(dp[i-1][j],dp[i][j]);
				else add(dp[i-1][j+(j+v)/(i-1)],dp[i][j]);
			}
		}
	}
	for(int i=1;i<=200*100;i++){
		sub(sum,dp[1][i]*i%mod*modpow(k+1,n-k,mod)%mod);
	}
	cout<<sum<<endl;
	return 0;
}