#include <bits/stdc++.h>
using namespace std;
bool hadDebugEnv = false;
bool isDebugEnv = false;
bool isDebug() {
  if (!hadDebugEnv) {
    hadDebugEnv = true;
    isDebugEnv = (getenv("SWATMAD_CF_DEBUG") != NULL);
  }
  return isDebugEnv;
}
chrono::high_resolution_clock::time_point timeStart;
const int INF = numeric_limits<int>::max();
const long long LLINF = numeric_limits<long long>::max();
const double PI = atan(1) * 4;
std::bitset<32> bits(int x) { return std::bitset<32>(x); }
template <class F, class S>
ostream& operator<<(ostream& o, const pair<F, S>& p) {
  return o << "(" << p.first << ", " << p.second << ")";
}
template <class T>
ostream& operator<<(ostream& o, const vector<T>& a);
template <class C>
void csp(ostream& o, const C& c) {
  bool f = 1;
  for (const auto& x : c) {
    if (!f) o << ", ";
    f = 0;
    o << x;
  }
}
template <class T>
ostream& operator<<(ostream& o, const vector<T>& a) {
  o << "[";
  csp(o, a);
  o << "]";
  return o;
}
template <class T>
ostream& operator<<(ostream& o, const vector<vector<T>>& a) {
  for (const auto& x : a) {
    o << "[";
    csp(o, x);
    o << "]\n";
  }
  return o;
}
template <class T, class R>
ostream& operator<<(ostream& o, const map<T, R>& a) {
  o << "{";
  csp(o, a);
  o << "}";
  return o;
}
template <class T, class R>
ostream& operator<<(ostream& o, const unordered_map<T, R>& a) {
  o << "{";
  csp(o, a);
  o << "}";
  return o;
}
template <class T>
ostream& operator<<(ostream& o, const set<T>& a) {
  o << "{";
  csp(o, a);
  o << "}";
  return o;
}
template <class T>
ostream& operator<<(ostream& o, const unordered_set<T>& a) {
  o << "{";
  csp(o, a);
  o << "}";
  return o;
}
int M = 1000000007;
int gcdex(int a, int b, int& x, int& y) {
  if (a == 0) {
    x = 0;
    y = 1;
    return b;
  }
  int x1;
  int y1;
  int d = gcdex(b % a, a, x1, y1);
  x = y1 - (b / a) * x1;
  y = x1;
  return d;
}
int obr(int a, int mod) {
  int x;
  int y;
  int g = gcdex(a, mod, x, y);
  assert(g == 1);
  x = (x % mod + mod) % mod;
  return x;
}
int c(int k, int n, int mod) {
  long long chisl = 1;
  for (int i = n - k + 1; i <= n; ++i) {
    chisl = (chisl * i) % mod;
  }
  long long znam = 1;
  for (int i = 2; i <= k; ++i) {
    znam = (znam * i) % mod;
  }
  return (chisl * obr(znam, mod)) % mod;
}
int main() {
  if (isDebug()) {
    timeStart = chrono::high_resolution_clock::now();
  };
  ios_base::sync_with_stdio(false);
  int n;
  cin >> n;
  ;
  int k;
  cin >> k;
  ;
  string s;
  cin >> s;
  ;
  if (n == 1) {
    cout << s << '\n';
    ;
    return 0;
  }
  reverse(s.begin(), s.end());
  vector<int> a(n);
  for (int i = 0; i < (int)(n); ++i) {
    a[i] = s[i] - '0';
  }
  if (k == 0) {
    long long ans = 0;
    long long pw10 = 1;
    for (int i = 0; i < (int)(n); ++i) {
      ans = (ans + (pw10 * a[i]) % M) % M;
      pw10 = (pw10 * 10) % M;
    }
    cout << ans << '\n';
    ;
    return 0;
  }
  vector<long long> b(n + 1, 0);
  b[n - 1] = a[n - 1];
  for (int i = (int)(n - 1) - 1; i >= 0; --i) {
    b[i] = (b[i + 1] + a[i]) % M;
  }
  if (isDebug()) {
    cerr << a << '\n';
  };
  if (isDebug()) {
    cerr << b << '\n';
  };
  long long ans = 0;
  long long pw10 = 1;
  long long cnk = c(k - 1, n - 2, M);
  long long cnk1 = c(k, n - 1, M);
  if (isDebug()) {
    cerr << "C iz " << (n - 1) << " po " << k << " = " << cnk << '\n';
  };
  for (int i = 0; i < (int)(n); ++i) {
    if (n - i - 1 < k) {
      break;
    }
    if (i) {
      pw10 = (pw10 * 10) % M;
      cnk = (cnk * (n - i - k)) % M;
      cnk = (cnk * obr(n - i - 1, M)) % M;
      if (isDebug()) {
        cerr << "C iz " << (n - i - 2) << " po " << k - 1 << " = " << cnk
             << '\n';
      };
      cnk1 = (cnk1 * (n - i - k)) % M;
      cnk1 = (cnk1 * obr(n - i, M)) % M;
      if (isDebug()) {
        cerr << "C iz " << (n - i - 1) << " po " << k << " = " << cnk1 << '\n';
      };
    }
    long long slag = (pw10 * cnk) % M;
    slag = (slag * b[i + 1]) % M;
    if (isDebug()) {
      cerr << slag << '\n';
    };
    ans = (ans + slag) % M;
    long long slag1 = (pw10 * cnk1) % M;
    slag1 = (slag1 * a[i]) % M;
    if (isDebug()) {
      cerr << slag1 << '\n';
    };
    ans = (ans + slag1) % M;
  }
  cout << ans << '\n';
  ;
  if (isDebug()) {
    cerr << "Time check: "
         << double(chrono::duration_cast<chrono::milliseconds>(
                       chrono::high_resolution_clock::now() - timeStart)
                       .count()) /
                1000
         << '\n';
  };
  return 0;
}
