#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
long long INF = 1e16;
int inf = 1e9;
long long MOD = 1e9 + 7;
template <typename T>
ostream& operator<<(ostream& os, const vector<T>& vec) {
  os << "{ ";
  for (int i = (0); i < (vec.size()); ++i) {
    os << vec[i] << " ";
  }
  os << "}";
  return os;
}
long long pow_mod(long long a, long long p) {
  long long res = 1;
  while (p) {
    if (p & 1) res = (res * a) % MOD;
    a = (a * a) % MOD;
    p >>= 1;
  }
  return res;
}
long long mod_inv(long long a, long long m) {
  long long b = m, u = 0, v = 1;
  while (a) {
    long long t = b / a;
    swap(b -= t * a, a);
    swap(u -= t * v, v);
  }
  return (u % m + m) % m;
}
long long gcd(long long a, long long b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
void d_err() { cerr << endl; }
template <typename H, typename... T>
void d_err(H h, T... t) {
  cerr << h << " ";
  d_err(t...);
}
int main() {
  cin.tie(0);
  ios_base::sync_with_stdio(false);
  string N;
  int K;
  cin >> N >> K;
  int MD = N.size();
  long long dp[MD + 1][2][K + 1];
  memset(dp, 0, sizeof(dp));
  dp[0][0][0] = 1;
  for (int i = (0); i < (MD); ++i) {
    int d = N[i] - '0';
    for (int k = (0); k < (K + 1); ++k) {
      if (k < K) {
        dp[i + 1][1][k + 1] += dp[i][1][k] * 9;
        dp[i + 1][1][k + 1] += dp[i][0][k] * (d - 1);
        if (d > 0) {
          dp[i + 1][0][k + 1] += dp[i][0][k];
        }
      }
      dp[i + 1][1][k] += dp[i][1][k];
      if (d == 0)
        dp[i + 1][0][k] += dp[i][0][k];
      else
        dp[i + 1][1][k] += dp[i][0][k];
    }
  }
  cout << fixed << setprecision(20);
  cout << dp[MD][0][K] + dp[MD][1][K] << endl;
}
