#再帰ver



N=int(eval(input()))

K=int(eval(input()))



from collections import defaultdict

dd = defaultdict(int)





#NN以下，KKが非zero要素を残り使っても良い回数

def rep(NN,KK):

    if KK<0:

        return 0

    

    ha=NN*10+KK

    if dd[ha]!=0:

        return dd[ha]

    

    if NN<0:

        return 0

    

    if NN==0:

        if KK==0:

            return 1

        return 0

        

    

    na=NN//10

    nb=NN%10

    if nb==0:

        dd[ha]=rep(na,KK)+rep(na-1,KK-1)*9

        return dd[ha]

    else:

        dd[ha]=rep(na,KK)+rep(na,KK-1)*nb+rep(na-1,KK-1)*(9-nb)

        return dd[ha]

    

print((rep(N,K)))

    











def I(): return int(eval(input()))

def MI(): return list(map(int, input().split()))

def LI(): return list(map(int, input().split()))



def main():

    mod=10**9+7

    S=eval(input())

    N=len(S)

    K=I()

    

    dpl=[[0]*(K+1)for _ in range(N+1)]

    dpt=[[0]*(K+1)for _ in range(N+1)]

    

    #dp[i][j]はi桁目まで見て0以外がj個．tは上限

    dpt[0][0]=1

    

    for i in range(N):

        #とりあえずルーズな方

        for j in range(K+1):

            dpl[i+1][j]=dpl[i][j]# 0が増えた場合

            

        for j in range(1,K+1):

            dpl[i+1][j]+=dpl[i][j-1]*9 # 0以外が増えた場合

            

        s=int(S[i])

        #タイトな方

        if s==0:

            for j in range(K+1):

                dpt[i+1][j]=dpt[i][j]#0をつけるしかない

        else:

            for j in range(1,K+1):

                dpt[i+1][j]=dpt[i][j-1]#0以外をつける

            

            #ルーズに落ちる

            for j in range(K+1):

                dpl[i+1][j]+=dpt[i][j]#0をつける

            #ルーズに落ちる

            for j in range(K):

                dpl[i+1][j+1]+=dpt[i][j]*(s-1)#0以外をつける

                

    ans=dpt[-1][-1]+dpl[-1][-1]

    

    print(ans)

    

    # for i in range(N+1):

    #     print(dpt[i])

        

    # print()

    # for i in range(N+1):

    #     print(dpl[i])

                

            

            

        

        



main()

# 再帰ver
N = int(eval(input()))
K = int(eval(input()))
from collections import defaultdict

dd = defaultdict(int)
# NN以下，KKが非zero要素を残り使っても良い回数
def rep(NN, KK):
    if KK < 0:
        return 0
    ha = NN * 10 + KK
    if dd[ha] != 0:
        return dd[ha]
    if NN < 0:
        return 0
    if NN == 0:
        if KK == 0:
            return 1
        return 0
    na = NN // 10
    nb = NN % 10
    if nb == 0:
        dd[ha] = rep(na, KK) + rep(na - 1, KK - 1) * 9
        return dd[ha]
    else:
        dd[ha] = rep(na, KK) + rep(na, KK - 1) * nb + rep(na - 1, KK - 1) * (9 - nb)
        return dd[ha]


print((rep(N, K)))

def I():
    return int(eval(input()))


def MI():
    return list(map(int, input().split()))


def LI():
    return list(map(int, input().split()))


def main():
    mod = 10**9 + 7
    S = eval(input())
    N = len(S)
    K = I()
    dpl = [[0] * (K + 1) for _ in range(N + 1)]
    dpt = [[0] * (K + 1) for _ in range(N + 1)]
    # dp[i][j]はi桁目まで見て0以外がj個．tは上限
    dpt[0][0] = 1
    for i in range(N):
        # とりあえずルーズな方
        for j in range(K + 1):
            dpl[i + 1][j] = dpl[i][j]  # 0が増えた場合
        for j in range(1, K + 1):
            dpl[i + 1][j] += dpl[i][j - 1] * 9  # 0以外が増えた場合
        s = int(S[i])
        # タイトな方
        if s == 0:
            for j in range(K + 1):
                dpt[i + 1][j] = dpt[i][j]  # 0をつけるしかない
        else:
            for j in range(1, K + 1):
                dpt[i + 1][j] = dpt[i][j - 1]  # 0以外をつける
            # ルーズに落ちる
            for j in range(K + 1):
                dpl[i + 1][j] += dpt[i][j]  # 0をつける
            # ルーズに落ちる
            for j in range(K):
                dpl[i + 1][j + 1] += dpt[i][j] * (s - 1)  # 0以外をつける
    ans = dpt[-1][-1] + dpl[-1][-1]
    print(ans)
    # for i in range(N+1):
    #     print(dpt[i])
    # print()
    # for i in range(N+1):
    #     print(dpl[i])


main()

-# 再帰ver -N = int(eval(input())) -K = int(eval(input())) -from collections import defaultdict - -dd = defaultdict(int) -# NN以下，KKが非zero要素を残り使っても良い回数 -def rep(NN, KK): -    if KK < 0: -        return 0 -    ha = NN * 10 + KK -    if dd[ha] != 0: -        return dd[ha] -    if NN < 0: -        return 0 -    if NN == 0: -        if KK == 0: -            return 1 -        return 0 -    na = NN // 10 -    nb = NN % 10 -    if nb == 0: -        dd[ha] = rep(na, KK) + rep(na - 1, KK - 1) * 9 -        return dd[ha] -    else: -        dd[ha] = rep(na, KK) + rep(na, KK - 1) * nb + rep(na - 1, KK - 1) * (9 - nb) -        return dd[ha] +def I(): +    return int(eval(input())) -print((rep(N, K))) +def MI(): +    return list(map(int, input().split())) + + +def LI(): +    return list(map(int, input().split())) + + +def main(): +    mod = 10**9 + 7 +    S = eval(input()) +    N = len(S) +    K = I() +    dpl = [[0] * (K + 1) for _ in range(N + 1)] +    dpt = [[0] * (K + 1) for _ in range(N + 1)] +    # dp[i][j]はi桁目まで見て0以外がj個．tは上限 +    dpt[0][0] = 1 +    for i in range(N): +        # とりあえずルーズな方 +        for j in range(K + 1): +            dpl[i + 1][j] = dpl[i][j]  # 0が増えた場合 +        for j in range(1, K + 1): +            dpl[i + 1][j] += dpl[i][j - 1] * 9  # 0以外が増えた場合 +        s = int(S[i]) +        # タイトな方 +        if s == 0: +            for j in range(K + 1): +                dpt[i + 1][j] = dpt[i][j]  # 0をつけるしかない +        else: +            for j in range(1, K + 1): +                dpt[i + 1][j] = dpt[i][j - 1]  # 0以外をつける +            # ルーズに落ちる +            for j in range(K + 1): +                dpl[i + 1][j] += dpt[i][j]  # 0をつける +            # ルーズに落ちる +            for j in range(K): +                dpl[i + 1][j + 1] += dpt[i][j] * (s - 1)  # 0以外をつける +    ans = dpt[-1][-1] + dpl[-1][-1] +    print(ans) +    # for i in range(N+1): +    #     print(dpt[i]) +    # print() +    # for i in range(N+1): +    #     print(dpl[i]) + + +main()