#include <bits/stdc++.h>
using namespace std;
using Int = long long;
using _int = int;
using ll = long long;
using Double = long double;
const Int INF = (1LL << 60) + 1e9;
const Int mod = (1e9) + 7;
const Double EPS = 1e-8;
const Double PI = 6.0 * asin((Double)0.5);
using P = pair<Int, Int>;
template <class T>
T Max(T& a, T b) {
  return a = max(a, b);
}
template <class T>
T Min(T& a, T b) {
  return a = min(a, b);
}
template <class T1, class T2>
ostream& operator<<(ostream& o, pair<T1, T2> p) {
  return o << "(" << p.first << "," << p.second << ")";
}
template <class T1, class T2, class T3>
ostream& operator<<(ostream& o, tuple<T1, T2, T3> t) {
  return o << "(" << get<0>(t) << "," << get<1>(t) << "," << get<2>(t) << ")";
}
template <class T1, class T2>
istream& operator>>(istream& i, pair<T1, T2>& p) {
  return i >> p.first >> p.second;
}
template <class T>
ostream& operator<<(ostream& o, vector<T> a) {
  Int i = 0;
  for (T t : a) o << (i++ ? " " : "") << t;
  return o;
}
template <class T>
istream& operator>>(istream& i, vector<T>& a) {
  for (T& t : a) i >> t;
  return i;
}
string N;
Int K;
int used[101][2][2][101];
int mem[101][2][2][101];
Int dfs(Int idx, Int allZero, Int same, Int cnt, string s) {
  if (idx >= Int(N.size())) return cnt == K;
  if (cnt > K) return 0;
  if (used[idx][allZero][same][cnt]++) return mem[idx][allZero][same][cnt];
  int res = 0;
  for (Int i = 0; i < 10; i++) {
    Int nidx = idx + 1;
    Int nallZero = allZero && (i == 0);
    Int nsame = same && (N[idx] == i + '0');
    Int ncnt = cnt + (i != 0);
    if (same && N[idx] < i + '0') continue;
    res += dfs(nidx, nallZero, nsame, ncnt, "");
  }
  return mem[idx][allZero][same][cnt] = res;
}
signed main() {
  srand((unsigned)time(NULL));
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  cout << fixed << setprecision(12);
  cin >> N >> K;
  Int ans = dfs(0, 1, 1, 0, "");
  cout << ans << endl;
  return 0;
}
