import sys

sys.setrecursionlimit(10**7) #再帰関数の上限,10**5以上の場合python

import math

from copy import copy, deepcopy

from copy import deepcopy as dcp

from operator import itemgetter

from bisect import bisect_left, bisect, bisect_right#2分探索

#bisect_left(l,x), bisect(l,x)#aはソート済みである必要あり。aの中からx未満の要素数を返す。rightだと以下

from collections import deque

#deque(l), pop(), append(x), popleft(), appendleft(x)

##listでqueの代用をするとO(N)の計算量がかかってしまうので注意

from collections import Counter#文字列を個数カウント辞書に、

#S=Counter(l),S.most_common(x),S.keys(),S.values(),S.items()

from itertools import accumulate,combinations,permutations#累積和

#list(accumulate(l))

from heapq import heapify,heappop,heappush

#heapify(q),heappush(q,a),heappop(q) #q=heapify(q)としないこと、返り値はNone

#import fractions#古いatcoderコンテストの場合GCDなどはここからimportする

from functools import lru_cache#pypyでもうごく

#@lru_cache(maxsize = None)#maxsizeは保存するデータ数の最大値、2**nが最も高効率

from decimal import Decimal



def input(): 

    x=sys.stdin.readline()

    return x[:-1] if x[-1]=="\n" else x

def printl(li): _=print(*li, sep="\n") if li else None

def argsort(s, return_sorted=False): 

    inds=sorted(range(len(s)), key=lambda k: s[k])

    if return_sorted: return inds, [s[i] for i in inds]

    return inds

def alp2num(c,cap=False): return ord(c)-97 if not cap else ord(c)-65

def num2alp(i,cap=False): return chr(i+97) if not cap else chr(i+65)

def matmat(A,B):

    K,N,M=len(B),len(A),len(B[0])

    return [[sum([(A[i][k]*B[k][j]) for k in range(K)]) for j in range(M)] for i in range(N)]

def matvec(M,v):

    N,size=len(v),len(M)

    return [sum([M[i][j]*v[j] for j in range(N)]) for i in range(size)]

def T(M):

    n,m=len(M),len(M[0])

    return [[M[j][i] for j in range(n)] for i in range(m)]

def main():

    mod = 1000000007

    #w.sort(key=itemgetter(1),reversed=True)  #二個目の要素で降順並び替え



    s = input()

    K= int(input())

    #N, K = map(int, input().split())

    #A = tuple(map(int, input().split())) #1行ベクトル

    #L = tuple(int(input()) for i in range(N)) #改行ベクトル

    #S = tuple(tuple(map(int, input().split())) for i in range(N)) #改行行列

    keta=len(s)

    dp=[[[0,0] for _ in range(K+1)] for _ in range(keta+1)]

    #dp[i][j][k]前からi桁目まで決め、j個の条件を満たす桁を含み、k=1:i文字目まで一致 k=0:対象の数以下



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

    for i in range(0,keta):

        ni=i+1

        nd=int(s[i])

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

            for k in range(0,2):  

                for d in range(10): 

                    nj=j

                    nk=k

                    if d!=0:nj+=1

                    if nj>K:continue

                    if k==0:

                        if d>nd:break

                        elif d<nd:nk=1

                    dp[ni][nj][nk]+=dp[i][j][k]

    if K<=keta:

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

    else:

        ans=0

        #与えられた数未満で条件を満たすもの+与えられた数が条件を満たす場合1

    print(ans)

    #print(dp)





    

    



        

    







if __name__ == "__main__":

    main()

import sys



def input(): 

    x=sys.stdin.readline()

    return x[:-1] if x[-1]=="\n" else x



#ABC145-E

def kdp(s,K):#s(str)以下の非負整数で条件をK桁満たすものの個数

    #K: 条件を満たすべき桁数 O(桁数*条件を満たすべき桁数*10)

    

    #mod = 1000000007

    keta=len(s)

    dp=[[[0,0] for _ in range(K+1)] for _ in range(keta+1)]

    #dp[i][j][k]前からi桁目まで決め、j個の条件を満たす桁を含み、k=1:i文字目まで一致 k=0:対象の数以下



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

    for i in range(0,keta):

        ni=i+1

        nd=int(s[i])

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

            for k in range(0,2):  

                for d in range(10): 

                    nj=j

                    nk=k

                    if d!=0:#この辺に条件

                        nj+=1

                    if nj>K:continue

                    if k==0:

                        if d>nd:

                            break

                        elif d<nd:

                            nk=1

                    dp[ni][nj][nk]+=dp[i][j][k]



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

    #与えられた数未満で条件を満たすもの+与えられた数が条件を満たす場合1

    print(ans)



if __name__ == "__main__":

    s = eval(input())

    K= int(eval(input()))#条件を満たすべき桁数

    kdp(s,K)
import sys

sys.setrecursionlimit(10**7)  # 再帰関数の上限,10**5以上の場合python
import math
from copy import copy, deepcopy
from copy import deepcopy as dcp
from operator import itemgetter
from bisect import bisect_left, bisect, bisect_right  # 2分探索

# bisect_left(l,x), bisect(l,x)#aはソート済みである必要あり。aの中からx未満の要素数を返す。rightだと以下
from collections import deque

# deque(l), pop(), append(x), popleft(), appendleft(x)
##listでqueの代用をするとO(N)の計算量がかかってしまうので注意
from collections import Counter  # 文字列を個数カウント辞書に、

# S=Counter(l),S.most_common(x),S.keys(),S.values(),S.items()
from itertools import accumulate, combinations, permutations  # 累積和

# list(accumulate(l))
from heapq import heapify, heappop, heappush

# heapify(q),heappush(q,a),heappop(q) #q=heapify(q)としないこと、返り値はNone
# import fractions#古いatcoderコンテストの場合GCDなどはここからimportする
from functools import lru_cache  # pypyでもうごく

# @lru_cache(maxsize = None)#maxsizeは保存するデータ数の最大値、2**nが最も高効率
from decimal import Decimal


def input():
    x = sys.stdin.readline()
    return x[:-1] if x[-1] == "\n" else x


def printl(li):
    _ = print(*li, sep="\n") if li else None


def argsort(s, return_sorted=False):
    inds = sorted(range(len(s)), key=lambda k: s[k])
    if return_sorted:
        return inds, [s[i] for i in inds]
    return inds


def alp2num(c, cap=False):
    return ord(c) - 97 if not cap else ord(c) - 65


def num2alp(i, cap=False):
    return chr(i + 97) if not cap else chr(i + 65)


def matmat(A, B):
    K, N, M = len(B), len(A), len(B[0])
    return [
        [sum([(A[i][k] * B[k][j]) for k in range(K)]) for j in range(M)]
        for i in range(N)
    ]


def matvec(M, v):
    N, size = len(v), len(M)
    return [sum([M[i][j] * v[j] for j in range(N)]) for i in range(size)]


def T(M):
    n, m = len(M), len(M[0])
    return [[M[j][i] for j in range(n)] for i in range(m)]


def main():
    mod = 1000000007
    # w.sort(key=itemgetter(1),reversed=True)  #二個目の要素で降順並び替え
    s = input()
    K = int(input())
    # N, K = map(int, input().split())
    # A = tuple(map(int, input().split())) #1行ベクトル
    # L = tuple(int(input()) for i in range(N)) #改行ベクトル
    # S = tuple(tuple(map(int, input().split())) for i in range(N)) #改行行列
    keta = len(s)
    dp = [[[0, 0] for _ in range(K + 1)] for _ in range(keta + 1)]
    # dp[i][j][k]前からi桁目まで決め、j個の条件を満たす桁を含み、k=1:i文字目まで一致 k=0:対象の数以下
    dp[0][0][0] = 1
    for i in range(0, keta):
        ni = i + 1
        nd = int(s[i])
        for j in range(0, K + 1):
            for k in range(0, 2):
                for d in range(10):
                    nj = j
                    nk = k
                    if d != 0:
                        nj += 1
                    if nj > K:
                        continue
                    if k == 0:
                        if d > nd:
                            break
                        elif d < nd:
                            nk = 1
                    dp[ni][nj][nk] += dp[i][j][k]
    if K <= keta:
        ans = dp[keta][K][1] + dp[keta][K][0]
    else:
        ans = 0
        # 与えられた数未満で条件を満たすもの+与えられた数が条件を満たす場合1
    print(ans)
    # print(dp)


if __name__ == "__main__":
    main()

import sys


def input():
    x = sys.stdin.readline()
    return x[:-1] if x[-1] == "\n" else x


# ABC145-E
def kdp(s, K):  # s(str)以下の非負整数で条件をK桁満たすものの個数
    # K: 条件を満たすべき桁数 O(桁数*条件を満たすべき桁数*10)
    # mod = 1000000007
    keta = len(s)
    dp = [[[0, 0] for _ in range(K + 1)] for _ in range(keta + 1)]
    # dp[i][j][k]前からi桁目まで決め、j個の条件を満たす桁を含み、k=1:i文字目まで一致 k=0:対象の数以下
    dp[0][0][0] = 1
    for i in range(0, keta):
        ni = i + 1
        nd = int(s[i])
        for j in range(0, K + 1):
            for k in range(0, 2):
                for d in range(10):
                    nj = j
                    nk = k
                    if d != 0:  # この辺に条件
                        nj += 1
                    if nj > K:
                        continue
                    if k == 0:
                        if d > nd:
                            break
                        elif d < nd:
                            nk = 1
                    dp[ni][nj][nk] += dp[i][j][k]
    ans = dp[keta][K][1] + dp[keta][K][0]
    # 与えられた数未満で条件を満たすもの+与えられた数が条件を満たす場合1
    print(ans)


if __name__ == "__main__":
    s = eval(input())
    K = int(eval(input()))  # 条件を満たすべき桁数
    kdp(s, K)

- -sys.setrecursionlimit(10**7)  # 再帰関数の上限,10**5以上の場合python -import math -from copy import copy, deepcopy -from copy import deepcopy as dcp -from operator import itemgetter -from bisect import bisect_left, bisect, bisect_right  # 2分探索 - -# bisect_left(l,x), bisect(l,x)#aはソート済みである必要あり。aの中からx未満の要素数を返す。rightだと以下 -from collections import deque - -# deque(l), pop(), append(x), popleft(), appendleft(x) -##listでqueの代用をするとO(N)の計算量がかかってしまうので注意 -from collections import Counter  # 文字列を個数カウント辞書に、 - -# S=Counter(l),S.most_common(x),S.keys(),S.values(),S.items() -from itertools import accumulate, combinations, permutations  # 累積和 - -# list(accumulate(l)) -from heapq import heapify, heappop, heappush - -# heapify(q),heappush(q,a),heappop(q) #q=heapify(q)としないこと、返り値はNone -# import fractions#古いatcoderコンテストの場合GCDなどはここからimportする -from functools import lru_cache  # pypyでもうごく - -# @lru_cache(maxsize = None)#maxsizeは保存するデータ数の最大値、2**nが最も高効率 -from decimal import Decimal -def printl(li): -    _ = print(*li, sep="\n") if li else None - - -def argsort(s, return_sorted=False): -    inds = sorted(range(len(s)), key=lambda k: s[k]) -    if return_sorted: -        return inds, [s[i] for i in inds] -    return inds - - -def alp2num(c, cap=False): -    return ord(c) - 97 if not cap else ord(c) - 65 - - -def num2alp(i, cap=False): -    return chr(i + 97) if not cap else chr(i + 65) - - -def matmat(A, B): -    K, N, M = len(B), len(A), len(B[0]) -    return [ -        [sum([(A[i][k] * B[k][j]) for k in range(K)]) for j in range(M)] -        for i in range(N) -    ] - - -def matvec(M, v): -    N, size = len(v), len(M) -    return [sum([M[i][j] * v[j] for j in range(N)]) for i in range(size)] - - -def T(M): -    n, m = len(M), len(M[0]) -    return [[M[j][i] for j in range(n)] for i in range(m)] - - -def main(): -    mod = 1000000007 -    # w.sort(key=itemgetter(1),reversed=True)  #二個目の要素で降順並び替え -    s = input() -    K = int(input()) -    # N, K = map(int, input().split()) -    # A = tuple(map(int, input().split())) #1行ベクトル -    # L = tuple(int(input()) for i in range(N)) #改行ベクトル -    # S = tuple(tuple(map(int, input().split())) for i in range(N)) #改行行列 +# ABC145-E +def kdp(s, K):  # s(str)以下の非負整数で条件をK桁満たすものの個数 +    # K: 条件を満たすべき桁数 O(桁数*条件を満たすべき桁数*10) +    # mod = 1000000007 -                    if d != 0: +                    if d != 0:  # この辺に条件 -    if K <= keta: -        ans = dp[keta][K][1] + dp[keta][K][0] -    else: -        ans = 0 -        # 与えられた数未満で条件を満たすもの+与えられた数が条件を満たす場合1 +    ans = dp[keta][K][1] + dp[keta][K][0] +    # 与えられた数未満で条件を満たすもの+与えられた数が条件を満たす場合1 -    # print(dp) -    main() +    s = eval(input()) +    K = int(eval(input()))  # 条件を満たすべき桁数 +    kdp(s, K)