#include<iostream>
#include<string>
#include<vector>
#include<boost/multiprecision/cpp_int.hpp>

namespace mp = boost::multiprecision;

// 組み合わせ
std::vector<std::vector<long long>> comb(int n) {
  std::vector<std::vector<long long>> v(n + 1,std::vector<long long>(n + 1, 0));
  for (int i = 0; i < v.size(); i++) {
    v[i][0] = 1;
    v[i][i] = 1;
  }
  for (int j = 1; j < v.size(); j++) {
    for (int k = 1; k < j; k++) {
      v[j][k] = (v[j - 1][k - 1] + v[j - 1][k]);
    }
  }
  return v;
}




int main(){
    std::string input;
    std::cin >> input;
    mp::cpp_int x(input);
    int K;
    std::cin >> K;
    int keta = input.length();
    const int num_zero = keta - K; // 0の数
    int saijoi = input[0] - '0'; // 最上位の数字


    unsigned long long ans = 0;
    std::vector<std::vector<long long>> C = comb(keta);
    // 最上位にsaijoiを置く場合
    // 1つ降りた桁について同じ吟味を行なえばよい

    while(keta >= num_zero){
      if(keta == num_zero){
        ans++;
        break;
      }
      // 最上位に0を置く場合
      // 残りketa - 1個の部分でnum_zero - 1個の0を自由に置いて良いから
      ans += C[keta - 1][num_zero - 1] * 9;
      // 最上位に0以外を置く場合
      // 残りketa - 1個の部分でnum_zero個の0を自由に置いて良いから
      ans += C[keta - 1][num_zero] * 9 * (saijoi - 1);

      // 最上位をsaijoiに固定して1つ下の桁にくだる
      keta--;
      saijoi = input[input.length() - keta] - '0';
    }

    std::cout << ans << std::endl;

    return 0;
}