fun main(args: Array<String>) {
    val N = readInputLine().toCharArray()
    val K = readInputLine().toInt()

    // dp[i][j][k]
    // 上位i桁を見たときに、0以外の個数がj個、k=1なら現時点で見ている桁までNと等しい
    val dp = Array(N.size + 1) { Array(K + 2) { IntArray(2) } }

    dp[0][0][1] = 1

    for (i in N.indices) {
        for (j in 0..K) {
            // 参照している桁に0を設定
            // Nより小さいケース数は無条件で加算
            dp[i + 1][j][0] += dp[i][j][0]

            if (N[i] == '0') {
                // 参照している桁が0の場合のみ、Nに等しい数は0以外の個数そのままで引き継がれる
                dp[i + 1][j][1] += dp[i][j][1]
            } else {
                // 参照している桁が0以外の場合は、Nに等しいケースがNより小さいケースに移行
                dp[i + 1][j][0] += dp[i][j][1]
            }

            // 参照している桁に0以外を設定
            // Nより小さいケースは無条件で1～9設定可
            dp[i + 1][j + 1][0] += dp[i][j][0] * 9

            if (N[i] != '0') {
                // Nに等しいケースは、1～参照している桁-1までの値を設定して、Nに等しいケースからより小さいケースに遷移
                dp[i + 1][j + 1][0] += dp[i][j][1] * (N[i] - '1')
                
                // Nに等しいケースで、その桁の値を設定してNに等しいケースを継続
                dp[i + 1][j + 1][1] += dp[i][j][1]
            }
        }
    }

    println(dp[N.size][K][0] + dp[N.size][K][1])
}

fun readInputLine(): String {
    return readLine()!!
}
