# ref: https://atcoder.jp/contests/abc154/submissions/9991364



from functools import lru_cache



#0以上N以下の整数で、0でない数字がちょうどK個あるものの個数

@lru_cache(None)

def F(N, K):

    assert N >= 0

    if N < 10:

        if K == 0:

            return 1

        if K == 1:

            return N

        else:

            return 0

    

    q,r = divmod(N,10)



    ans = 0

    if K >= 1:

        # 1の位が0ではない

        ans += F(q, K-1) * r

        ans += F(q-1, K-1) * (9-r)

    # 1の位が0

    ans += F(q, K)

    

    return ans



def main():

    N = int(eval(input()))

    K = int(eval(input()))



    print((F(N,K)))



if __name__ == "__main__":

    main()
N = eval(input())

K = int(eval(input()))



L = len(N)



# dp[i][j][k]

# i: 決定した桁数(上から)

# j: 0の個数

# k: N未満確定フラグ

dp = [[[0] * 2 for _ in range(5)] for _ in range(110)]



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



# 配るDP

for i in range(L):

    S = int(N[i])

    for j in range(K+1):

        for k in range(2):

            # d: 次の桁

            for d in range((9 if k else S) + 1):

                dp[i+1][j + (d != 0)][k | (d < S)] += dp[i][j][k]



ans = dp[L][K][0] + dp[L][K][1]

print(ans)
# ref: https://atcoder.jp/contests/abc154/submissions/9991364
from functools import lru_cache

# 0以上N以下の整数で、0でない数字がちょうどK個あるものの個数
@lru_cache(None)
def F(N, K):
    assert N >= 0
    if N < 10:
        if K == 0:
            return 1
        if K == 1:
            return N
        else:
            return 0
    q, r = divmod(N, 10)
    ans = 0
    if K >= 1:
        # 1の位が0ではない
        ans += F(q, K - 1) * r
        ans += F(q - 1, K - 1) * (9 - r)
    # 1の位が0
    ans += F(q, K)
    return ans


def main():
    N = int(eval(input()))
    K = int(eval(input()))
    print((F(N, K)))


if __name__ == "__main__":
    main()

N = eval(input())
K = int(eval(input()))
L = len(N)
# dp[i][j][k]
# i: 決定した桁数(上から)
# j: 0の個数
# k: N未満確定フラグ
dp = [[[0] * 2 for _ in range(5)] for _ in range(110)]
dp[0][0][0] = 1
# 配るDP
for i in range(L):
    S = int(N[i])
    for j in range(K + 1):
        for k in range(2):
            # d: 次の桁
            for d in range((9 if k else S) + 1):
                dp[i + 1][j + (d != 0)][k | (d < S)] += dp[i][j][k]
ans = dp[L][K][0] + dp[L][K][1]
print(ans)

-# ref: https://atcoder.jp/contests/abc154/submissions/9991364 -from functools import lru_cache - -# 0以上N以下の整数で、0でない数字がちょうどK個あるものの個数 -@lru_cache(None) -def F(N, K): -    assert N >= 0 -    if N < 10: -        if K == 0: -            return 1 -        if K == 1: -            return N -        else: -            return 0 -    q, r = divmod(N, 10) -    ans = 0 -    if K >= 1: -        # 1の位が0ではない -        ans += F(q, K - 1) * r -        ans += F(q - 1, K - 1) * (9 - r) -    # 1の位が0 -    ans += F(q, K) -    return ans - - -def main(): -    N = int(eval(input())) -    K = int(eval(input())) -    print((F(N, K))) - - -if __name__ == "__main__": -    main() +N = eval(input()) +K = int(eval(input())) +L = len(N) +# dp[i][j][k] +# i: 決定した桁数(上から) +# j: 0の個数 +# k: N未満確定フラグ +dp = [[[0] * 2 for _ in range(5)] for _ in range(110)] +dp[0][0][0] = 1 +# 配るDP +for i in range(L): +    S = int(N[i]) +    for j in range(K + 1): +        for k in range(2): +            # d: 次の桁 +            for d in range((9 if k else S) + 1): +                dp[i + 1][j + (d != 0)][k | (d < S)] += dp[i][j][k] +ans = dp[L][K][0] + dp[L][K][1] +print(ans)