#define NguyenDangQuan the_author
#define my_heart love_you_to_the_moon_and_back
#pragma GCC target("avx2")
#pragma GCC optimization("O3")
#pragma GCC optimization("unroll-loops")
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
using ull = unsigned long long;
bool typetest;
inline void fastIOfileinput()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
typetest = 0;
}
const int N = 1e6 + 5;
int k;
ll n, tu;
ll f[N], rf[N], gt[N], rgt[N], agt[N], ragt[N];
const ll mod = 123456789;
void Read()
{
cin >> n >> k;
}
ll Pow(ll a, ll b)
{
ll ans = 1;
for (; b > 0; b >>= 1)
{
if (b & 1)
ans = ans * a % mod;
a = a * a % mod;
}
return ans;
}
void Solve()
{
f[0] = 0;
tu = 1;
gt[0] = rgt[0] = agt[0] = ragt[0] = 1;
for (int i = 1; i <= k + 2; ++i)
{
f[i] = (f[i - 1] + Pow(i, k)) % mod;
gt[i] = gt[i - 1] * i % mod;
agt[i] = agt[i - 1] * (-i) % mod;
rgt[i] = Pow(gt[i], mod - 2);
ragt[i] = Pow(agt[i], mod - 2);
tu = tu * (n - i) % mod;
//cout << i << " " << f[i] << "\n";
}
if (n <= k + 2)
{
cout << f[n];
return;
}
ll ans = 0;
for (int i = 1; i <= k + 2; ++i)
(ans += f[i] * rgt[i - 1] % mod * ragt[k + 2 - i] % mod * tu % mod * Pow(n - i, mod - 2) % mod) %= mod;
cout << (ans + mod) % mod;
}
int32_t main()
{
fastIOfileinput();
if (typetest)
{
int t;
cin >> t;
while (t--)
{
Read();
Solve();
}
}
else
{
Read();
Solve();
}
}
I2RlZmluZSBOZ3V5ZW5EYW5nUXVhbiB0aGVfYXV0aG9yCiNkZWZpbmUgbXlfaGVhcnQgbG92ZV95b3VfdG9fdGhlX21vb25fYW5kX2JhY2sKI3ByYWdtYSBHQ0MgdGFyZ2V0KCJhdngyIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemF0aW9uKCJPMyIpCiNwcmFnbWEgR0NDIG9wdGltaXphdGlvbigidW5yb2xsLWxvb3BzIikKCiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp1c2luZyBsbCA9IGxvbmcgbG9uZzsKdXNpbmcgbGQgPSBsb25nIGRvdWJsZTsKdXNpbmcgdWxsID0gdW5zaWduZWQgbG9uZyBsb25nOwoKYm9vbCB0eXBldGVzdDsKaW5saW5lIHZvaWQgZmFzdElPZmlsZWlucHV0KCkKewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oMCk7CgljaW4udGllKDApOwoJY291dC50aWUoMCk7Cgl0eXBldGVzdCA9IDA7Cn0KCmNvbnN0IGludCBOID0gMWU2ICsgNTsKaW50IGs7CmxsIG4sIHR1OwpsbCBmW05dLCByZltOXSwgZ3RbTl0sIHJndFtOXSwgYWd0W05dLCByYWd0W05dOwpjb25zdCBsbCBtb2QgPSAxMjM0NTY3ODk7Cgp2b2lkIFJlYWQoKQp7CgljaW4gPj4gbiA+PiBrOwp9CgpsbCBQb3cobGwgYSwgbGwgYikKewoJbGwgYW5zID0gMTsKCWZvciAoOyBiID4gMDsgYiA+Pj0gMSkKCXsKCQlpZiAoYiAmIDEpCgkJCWFucyA9IGFucyAqIGEgJSBtb2Q7CgkJYSA9IGEgKiBhICUgbW9kOwoJfQoJcmV0dXJuIGFuczsKfQoKdm9pZCBTb2x2ZSgpCnsKCWZbMF0gPSAwOwoJdHUgPSAxOwoJZ3RbMF0gPSByZ3RbMF0gPSBhZ3RbMF0gPSByYWd0WzBdID0gMTsKCWZvciAoaW50IGkgPSAxOyBpIDw9IGsgKyAyOyArK2kpCgl7CgkJZltpXSA9IChmW2kgLSAxXSArIFBvdyhpLCBrKSkgJSBtb2Q7CgkJZ3RbaV0gPSBndFtpIC0gMV0gKiBpICUgbW9kOwoJCWFndFtpXSA9IGFndFtpIC0gMV0gKiAoLWkpICUgbW9kOwoJCXJndFtpXSA9IFBvdyhndFtpXSwgbW9kIC0gMik7CgkJcmFndFtpXSA9IFBvdyhhZ3RbaV0sIG1vZCAtIDIpOwoJCXR1ID0gdHUgKiAobiAtIGkpICUgbW9kOwoJCS8vY291dCA8PCBpIDw8ICIgIiA8PCBmW2ldIDw8ICJcbiI7Cgl9CglpZiAobiA8PSBrICsgMikKCXsKCQljb3V0IDw8IGZbbl07CgkJcmV0dXJuOwoJfQoJbGwgYW5zID0gMDsKCWZvciAoaW50IGkgPSAxOyBpIDw9IGsgKyAyOyArK2kpCgkJKGFucyArPSBmW2ldICogcmd0W2kgLSAxXSAlIG1vZCAqIHJhZ3RbayArIDIgLSBpXSAlIG1vZCAqIHR1ICUgbW9kICogUG93KG4gLSBpLCBtb2QgLSAyKSAlIG1vZCkgJT0gbW9kOwoJY291dCA8PCAoYW5zICsgbW9kKSAlIG1vZDsKfQoKaW50MzJfdCBtYWluKCkKewoJZmFzdElPZmlsZWlucHV0KCk7CglpZiAodHlwZXRlc3QpCgoJewoJCWludCB0OwoJCWNpbiA+PiB0OwoJCXdoaWxlICh0LS0pCgkJewoJCQlSZWFkKCk7CgkJCVNvbHZlKCk7CgkJfQoJfQoJZWxzZQoJewoJCVJlYWQoKTsKCQlTb2x2ZSgpOwoJfQp9