from functools import lru_cache

n=int(eval(input()))

k=int(eval(input()))

@lru_cache(None)

def F(x,y):  #xという数字に対して0出ない数字がyこのモノの個数

    if x<10:

        if y==1:

            return x

        elif y==0:

            return 1

        else:

            return 0

    else:

        res=0

        q,r=divmod(x,10)

        res+=F(q,y)  #最後の桁が0

        if y>=1:

            res+=r*F(q,y-1) #最後の桁が1-r

            res+=(9-r)*F(q-1,y-1) #最後がr+1,,,9

        return res

print((F(n,k)))
n=eval(input())

keta=len(n)

k=int(eval(input()))

#上からi桁、0以外の数がk個、smallerはless flag



dp=[[[0]*2 for _ in range(4)] for _ in range(keta +1 )]

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

for i in range(keta):

    for j in range(4):

        for smaller in range(2):

            nd = int(n[i]) #見ている桁の数字

            for d in range(10):

                #遷移先の数字をn付きで定義しておく

                ni=i+1

                nj=j

                nsmaller=smaller

                #変数ごとに条件を見ていく

                #iは必ず1ずつ増える

                #jについて

                if d!=0:

                    nj+=1

                if nj > k:

                    continue  #条件に合わないのはcontinueで飛ばす

                #smallerについて

                if smaller ==0:  # 今までnと同じで来ている

                    if d > nd:

                        continue

                    if d <nd:

                        nsmaller=1

                #最後はこれで足し合わせてfinish

                dp[ni][nj][nsmaller]+=dp[i][j][smaller]

ans = dp[keta][k][0]+dp[keta][k][1]

print(ans)
from functools import lru_cache

n = int(eval(input()))
k = int(eval(input()))


@lru_cache(None)
def F(x, y):  # xという数字に対して0出ない数字がyこのモノの個数
    if x < 10:
        if y == 1:
            return x
        elif y == 0:
            return 1
        else:
            return 0
    else:
        res = 0
        q, r = divmod(x, 10)
        res += F(q, y)  # 最後の桁が0
        if y >= 1:
            res += r * F(q, y - 1)  # 最後の桁が1-r
            res += (9 - r) * F(q - 1, y - 1)  # 最後がr+1,,,9
        return res


print((F(n, k)))

n = eval(input())
keta = len(n)
k = int(eval(input()))
# 上からi桁、0以外の数がk個、smallerはless flag
dp = [[[0] * 2 for _ in range(4)] for _ in range(keta + 1)]
dp[0][0][0] = 1
for i in range(keta):
    for j in range(4):
        for smaller in range(2):
            nd = int(n[i])  # 見ている桁の数字
            for d in range(10):
                # 遷移先の数字をn付きで定義しておく
                ni = i + 1
                nj = j
                nsmaller = smaller
                # 変数ごとに条件を見ていく
                # iは必ず1ずつ増える
                # jについて
                if d != 0:
                    nj += 1
                if nj > k:
                    continue  # 条件に合わないのはcontinueで飛ばす
                # smallerについて
                if smaller == 0:  # 今までnと同じで来ている
                    if d > nd:
                        continue
                    if d < nd:
                        nsmaller = 1
                # 最後はこれで足し合わせてfinish
                dp[ni][nj][nsmaller] += dp[i][j][smaller]
ans = dp[keta][k][0] + dp[keta][k][1]
print(ans)

-from functools import lru_cache - -n = int(eval(input())) +n = eval(input()) +keta = len(n) - - -@lru_cache(None) -def F(x, y):  # xという数字に対して0出ない数字がyこのモノの個数 -    if x < 10: -        if y == 1: -            return x -        elif y == 0: -            return 1 -        else: -            return 0 -    else: -        res = 0 -        q, r = divmod(x, 10) -        res += F(q, y)  # 最後の桁が0 -        if y >= 1: -            res += r * F(q, y - 1)  # 最後の桁が1-r -            res += (9 - r) * F(q - 1, y - 1)  # 最後がr+1,,,9 -        return res - - -print((F(n, k))) +# 上からi桁、0以外の数がk個、smallerはless flag +dp = [[[0] * 2 for _ in range(4)] for _ in range(keta + 1)] +dp[0][0][0] = 1 +for i in range(keta): +    for j in range(4): +        for smaller in range(2): +            nd = int(n[i])  # 見ている桁の数字 +            for d in range(10): +                # 遷移先の数字をn付きで定義しておく +                ni = i + 1 +                nj = j +                nsmaller = smaller +                # 変数ごとに条件を見ていく +                # iは必ず1ずつ増える +                # jについて +                if d != 0: +                    nj += 1 +                if nj > k: +                    continue  # 条件に合わないのはcontinueで飛ばす +                # smallerについて +                if smaller == 0:  # 今までnと同じで来ている +                    if d > nd: +                        continue +                    if d < nd: +                        nsmaller = 1 +                # 最後はこれで足し合わせてfinish +                dp[ni][nj][nsmaller] += dp[i][j][smaller] +ans = dp[keta][k][0] + dp[keta][k][1] +print(ans)