// modified from submission 5652 (Author : Min)
#include <stdio.h>
#include <string.h>
#define maxd 10000000
#define mod 1000000007
typedef long long ll;
void swap(int *a, int *b)
{
if ((*a) != (*b))
(*a) ^= (*b), (*b) ^= (*a), (*a) ^= (*b);
}
__attribute__((target("avx2"), optimize("O3")))
int _inv(int a)
{
int _a = a, _b = mod, u = 1, v = 0;
while (_b)
{
int t = _a / _b;
_a -= t * _b;
swap(&_a, &_b);
u -= t * v;
swap(&u, &v);
}
u += mod, u %= mod;
return u;
}
int quick_pow(int x, ll p)
{
ll ans = 1;
while (p)
{
if (p & 1)
ans = ans * x % mod;
x = 1ll * x * x % mod;
p >>= 1;
}
return ans;
}
int inv[maxd + 10], cur_max_d;
int s1[maxd + 10], s2[maxd + 10];
void init_all() { inv[1] = 1, cur_max_d = 1; }
__attribute__((target("avx2"), optimize("O3")))
void init_inv(int d)
{
if (cur_max_d < d)
for (int i = cur_max_d + 1; i <= d + 1; ++i)
inv[i] = 1ll * inv[mod % i] * (mod - mod / i) % mod;
cur_max_d = d;
}
void init_case_1(int d) { memset(s1, 0, sizeof(s1[0]) * (d + 1)); }
void init_case_2(int d) { memset(s1, 0, sizeof(s1[0]) * (d + 1)), memset(s2, 0, sizeof(s2[0]) * (d + 1)); }
// \sum_{i=0}^{n-1} {(r^i)*(i^d)}
__attribute__((target("avx2"), optimize("O3")))
int sum_of_exp_time_poly(int r, int d, char *n)
{
init_inv(d);
int ans = 0;
int len = strlen(n);
ll mod_n = 0, pow_n = 0;
for (int i = 0; i < len; ++i)
{
mod_n = (mod_n << 1) + (mod_n << 3) + (n[i] ^ '0');
pow_n = (pow_n << 1) + (pow_n << 3) + (n[i] ^ '0');
// mod_n %= mod, pow_n %= (mod - 1);
mod_n = (mod_n >= mod) ? mod_n % mod : mod_n;
pow_n = (pow_n >= (mod - 1)) ? pow_n % (mod - 1) : pow_n;
}
if (r == 1)
{
// vector<int> s1(d + 1);
init_case_1(d);
for (int i = 0, t = 0, b = 1; i <= d; ++i)
{
b = 1ll * b * (mod_n + mod - i) % mod * inv[i + 1] % mod;
t = (t + quick_pow(i, d)) % mod;
s1[i] = 1ll * t * b % mod;
}
for (int i = 0, b = 1; i <= d; ++i)
{
ans = (ans + 1ll * b * ((i & 1) ? mod - s1[d - i] : s1[d - i])) % mod;
b = 1ll * b * (mod_n + mod - 1 - (d - i)) % mod * inv[i + 1] % mod;
}
}
else
{
// vector<int> s1(d + 1), s2(d + 1);
init_case_2(d);
int t1 = 0, t2 = 0;
for (int i = 0, rpow = 1; i <= d; ++i, rpow = 1ll * rpow * r % mod)
{
s1[i] = t1 = (t1 + 1ll * quick_pow(i, d) * rpow) % mod;
s2[i] = t2 = (t2 + 1ll * quick_pow(i + mod_n, d) * rpow) % mod;
}
int ans1 = 0, ans2 = 0, b = 1, mr = mod - r;
for (int i = 0; i <= d; ++i)
{
ans1 = (ans1 + 1ll * b * s1[d - i]) % mod;
ans2 = (ans2 + 1ll * b * s2[d - i]) % mod;
b = 1ll * b * mr % mod * (d + 1 - i) % mod * inv[i + 1] % mod;
}
ans = ans1 + mod - 1ll * quick_pow(r, pow_n) * ans2 % mod;
ans = 1ll * ans * _inv(quick_pow(mod + 1 - r, d + 1)) % mod;
}
return ans;
}
int r, d;
char n[100010];
__attribute__((target("avx2"), optimize("O3")))
int main()
{
init_all();
while (~scanf("%d%d%s", &r, &d, n))
printf("%d\n", sum_of_exp_time_poly(r, d, n));
}
Ly8gbW9kaWZpZWQgZnJvbSBzdWJtaXNzaW9uIDU2NTIgKEF1dGhvciA6IE1pbikKCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNkZWZpbmUgbWF4ZCAxMDAwMDAwMAojZGVmaW5lIG1vZCAxMDAwMDAwMDA3CnR5cGVkZWYgbG9uZyBsb25nIGxsOwoKdm9pZCBzd2FwKGludCAqYSwgaW50ICpiKQp7CiAgICBpZiAoKCphKSAhPSAoKmIpKQogICAgICAgICgqYSkgXj0gKCpiKSwgKCpiKSBePSAoKmEpLCAoKmEpIF49ICgqYik7Cn0KX19hdHRyaWJ1dGVfXygodGFyZ2V0KCJhdngyIiksIG9wdGltaXplKCJPMyIpKSkKaW50IF9pbnYoaW50IGEpCnsKICAgIGludCBfYSA9IGEsIF9iID0gbW9kLCB1ID0gMSwgdiA9IDA7CiAgICB3aGlsZSAoX2IpCiAgICB7CiAgICAgICAgaW50IHQgPSBfYSAvIF9iOwogICAgICAgIF9hIC09IHQgKiBfYjsKICAgICAgICBzd2FwKCZfYSwgJl9iKTsKICAgICAgICB1IC09IHQgKiB2OwogICAgICAgIHN3YXAoJnUsICZ2KTsKICAgIH0KICAgIHUgKz0gbW9kLCB1ICU9IG1vZDsKICAgIHJldHVybiB1Owp9CgppbnQgcXVpY2tfcG93KGludCB4LCBsbCBwKQp7CiAgICBsbCBhbnMgPSAxOwogICAgd2hpbGUgKHApCiAgICB7CiAgICAgICAgaWYgKHAgJiAxKQogICAgICAgICAgICBhbnMgPSBhbnMgKiB4ICUgbW9kOwogICAgICAgIHggPSAxbGwgKiB4ICogeCAlIG1vZDsKICAgICAgICBwID4+PSAxOwogICAgfQogICAgcmV0dXJuIGFuczsKfQoKaW50IGludlttYXhkICsgMTBdLCBjdXJfbWF4X2Q7CmludCBzMVttYXhkICsgMTBdLCBzMlttYXhkICsgMTBdOwoKdm9pZCBpbml0X2FsbCgpIHsgaW52WzFdID0gMSwgY3VyX21heF9kID0gMTsgfQpfX2F0dHJpYnV0ZV9fKCh0YXJnZXQoImF2eDIiKSwgb3B0aW1pemUoIk8zIikpKQp2b2lkIGluaXRfaW52KGludCBkKQp7CiAgICBpZiAoY3VyX21heF9kIDwgZCkKICAgICAgICBmb3IgKGludCBpID0gY3VyX21heF9kICsgMTsgaSA8PSBkICsgMTsgKytpKQogICAgICAgICAgICBpbnZbaV0gPSAxbGwgKiBpbnZbbW9kICUgaV0gKiAobW9kIC0gbW9kIC8gaSkgJSBtb2Q7CiAgICBjdXJfbWF4X2QgPSBkOwp9CnZvaWQgaW5pdF9jYXNlXzEoaW50IGQpIHsgbWVtc2V0KHMxLCAwLCBzaXplb2YoczFbMF0pICogKGQgKyAxKSk7IH0Kdm9pZCBpbml0X2Nhc2VfMihpbnQgZCkgeyBtZW1zZXQoczEsIDAsIHNpemVvZihzMVswXSkgKiAoZCArIDEpKSwgbWVtc2V0KHMyLCAwLCBzaXplb2YoczJbMF0pICogKGQgKyAxKSk7IH0KLy8gXHN1bV97aT0wfV57bi0xfSB7KHJeaSkqKGleZCl9Cl9fYXR0cmlidXRlX18oKHRhcmdldCgiYXZ4MiIpLCBvcHRpbWl6ZSgiTzMiKSkpCmludCBzdW1fb2ZfZXhwX3RpbWVfcG9seShpbnQgciwgaW50IGQsIGNoYXIgKm4pCnsKICAgIGluaXRfaW52KGQpOwogICAgaW50IGFucyA9IDA7CiAgICBpbnQgbGVuID0gc3RybGVuKG4pOwogICAgbGwgbW9kX24gPSAwLCBwb3dfbiA9IDA7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkKICAgICAgICB7CiAgICAgICAgICAgIG1vZF9uID0gKG1vZF9uIDw8IDEpICsgKG1vZF9uIDw8IDMpICsgKG5baV0gXiAnMCcpOwogICAgICAgICAgICBwb3dfbiA9IChwb3dfbiA8PCAxKSArIChwb3dfbiA8PCAzKSArIChuW2ldIF4gJzAnKTsKICAgICAgICAgICAgLy8gbW9kX24gJT0gbW9kLCBwb3dfbiAlPSAobW9kIC0gMSk7CiAgICAgICAgICAgIG1vZF9uID0gKG1vZF9uID49IG1vZCkgPyBtb2RfbiAlIG1vZCA6IG1vZF9uOwogICAgICAgICAgICBwb3dfbiA9IChwb3dfbiA+PSAobW9kIC0gMSkpID8gcG93X24gJSAobW9kIC0gMSkgOiBwb3dfbjsKICAgICAgICB9CiAgICAKICAgIGlmIChyID09IDEpCiAgICB7CiAgICAgICAgLy8gdmVjdG9yPGludD4gczEoZCArIDEpOwogICAgICAgIGluaXRfY2FzZV8xKGQpOwogICAgICAgIGZvciAoaW50IGkgPSAwLCB0ID0gMCwgYiA9IDE7IGkgPD0gZDsgKytpKQogICAgICAgIHsKICAgICAgICAgICAgYiA9IDFsbCAqIGIgKiAobW9kX24gKyBtb2QgLSBpKSAlIG1vZCAqIGludltpICsgMV0gJSBtb2Q7CiAgICAgICAgICAgIHQgPSAodCArIHF1aWNrX3BvdyhpLCBkKSkgJSBtb2Q7CiAgICAgICAgICAgIHMxW2ldID0gMWxsICogdCAqIGIgJSBtb2Q7CiAgICAgICAgfQogICAgICAgIGZvciAoaW50IGkgPSAwLCBiID0gMTsgaSA8PSBkOyArK2kpCiAgICAgICAgewogICAgICAgICAgICBhbnMgPSAoYW5zICsgMWxsICogYiAqICgoaSAmIDEpID8gbW9kIC0gczFbZCAtIGldIDogczFbZCAtIGldKSkgJSBtb2Q7CiAgICAgICAgICAgIGIgPSAxbGwgKiBiICogKG1vZF9uICsgbW9kIC0gMSAtIChkIC0gaSkpICUgbW9kICogaW52W2kgKyAxXSAlIG1vZDsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLy8gdmVjdG9yPGludD4gczEoZCArIDEpLCBzMihkICsgMSk7CiAgICAgICAgaW5pdF9jYXNlXzIoZCk7CiAgICAgICAgaW50IHQxID0gMCwgdDIgPSAwOwogICAgICAgIGZvciAoaW50IGkgPSAwLCBycG93ID0gMTsgaSA8PSBkOyArK2ksIHJwb3cgPSAxbGwgKiBycG93ICogciAlIG1vZCkKICAgICAgICB7CiAgICAgICAgICAgIHMxW2ldID0gdDEgPSAodDEgKyAxbGwgKiBxdWlja19wb3coaSwgZCkgKiBycG93KSAlIG1vZDsKICAgICAgICAgICAgczJbaV0gPSB0MiA9ICh0MiArIDFsbCAqIHF1aWNrX3BvdyhpICsgbW9kX24sIGQpICogcnBvdykgJSBtb2Q7CiAgICAgICAgfQogICAgICAgIGludCBhbnMxID0gMCwgYW5zMiA9IDAsIGIgPSAxLCBtciA9IG1vZCAtIHI7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gZDsgKytpKQogICAgICAgIHsKICAgICAgICAgICAgYW5zMSA9IChhbnMxICsgMWxsICogYiAqIHMxW2QgLSBpXSkgJSBtb2Q7CiAgICAgICAgICAgIGFuczIgPSAoYW5zMiArIDFsbCAqIGIgKiBzMltkIC0gaV0pICUgbW9kOwogICAgICAgICAgICBiID0gMWxsICogYiAqIG1yICUgbW9kICogKGQgKyAxIC0gaSkgJSBtb2QgKiBpbnZbaSArIDFdICUgbW9kOwogICAgICAgIH0KICAgICAgICBhbnMgPSBhbnMxICsgbW9kIC0gMWxsICogcXVpY2tfcG93KHIsIHBvd19uKSAqIGFuczIgJSBtb2Q7CiAgICAgICAgYW5zID0gMWxsICogYW5zICogX2ludihxdWlja19wb3cobW9kICsgMSAtIHIsIGQgKyAxKSkgJSBtb2Q7CiAgICB9CiAgICByZXR1cm4gYW5zOwp9CmludCByLCBkOwpjaGFyIG5bMTAwMDEwXTsKX19hdHRyaWJ1dGVfXygodGFyZ2V0KCJhdngyIiksIG9wdGltaXplKCJPMyIpKSkKaW50IG1haW4oKQp7CiAgICBpbml0X2FsbCgpOwogICAgd2hpbGUgKH5zY2FuZigiJWQlZCVzIiwgJnIsICZkLCBuKSkKICAgICAgICBwcmludGYoIiVkXG4iLCBzdW1fb2ZfZXhwX3RpbWVfcG9seShyLCBkLCBuKSk7Cn0=