#include #define rep(i,a,b) for(int i=a;i=b;i--) #define fore(i,a) for(auto &i:a) #define all(x) (x).begin(),(x).end() #pragma GCC optimize ("-O3") using namespace std; void _main(); int main() { cin.tie(0); ios::sync_with_stdio(false); _main(); } typedef long long ll; const int inf = INT_MAX / 2; const ll infl = 1LL << 60; templatebool chmax(T &a, const T &b) { if (abool chmin(T &a, const T &b) { if (b class Faulhaber { int add(int x, int y) { return (x += y) >= mod ? x - mod : x; } int mul(int x, int y) { return 1LL * x * y % mod; } int sub(int x, int y) { return add(x, mod - y); } int modpow(int a, long long b) { int ret = 1; while (b > 0) { if (b & 1) ret = 1LL * ret * a % mod; a = 1LL * a * a % mod; b >>= 1; } return ret; } int modinv(int a) { return modpow(a, mod - 2); } int div(int x, int y) { return mul(x, modinv(y)); } int C[N][N]; public: Faulhaber(){rep(i,0,N){C[i][0]=1;rep(j,1,i+1)C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;}} // 1^m + 2^m + ... + n^m int F(int n, int m) { if(!m)return n;vector dp(m+1);dp[0]=n;rep(k,1,m+1){int sm=sub(modpow(n+1,k+1),1); rep(i,0,k)sm=sub(sm,mul(dp[i],C[k+1][i]));dp[k]=div(sm,k+1);}return dp[m];} }; /*---------------------------------------------------------------------------------------------------             ∧_∧       ∧_∧  (´<_` )  Welcome to My Coding Space!      ( ´_ゝ`) /  ⌒i     /   \    | |     /   / ̄ ̄ ̄ ̄/  |   __(__ニつ/  _/ .| .|____      \/____/ (u ⊃ ---------------------------------------------------------------------------------------------------*/ const int mod = 1000000007; Faulhaber f; ll n; int k; //--------------------------------------------------------------------------------------------------- void _main() { cin >> n >> k; n %= mod; cout << f.F(n, k) << endl; }