Problem:
Score : 500 points

Problem Statement

Find the number of integers between 1 and N (inclusive) that contains exactly K non-zero digits when written in base ten.

Constraints

1 \leq N < 10^{100}

1 \leq K \leq 3

Input

Input is given from Standard Input in the following format:

N
K

Output

Print the count.

Sample Input 1

100
1

Sample Output 1

19

The following 19 integers satisfy the condition:

1,2,3,4,5,6,7,8,9,10,20,30,40,50,60,70,80,90,100

Sample Input 2

25
2

Sample Output 2

14

The following 14 integers satisfy the condition:

11,12,13,14,15,16,17,18,19,21,22,23,24,25

Sample Input 3

314159
2

Sample Output 3

937

Sample Input 4

9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
3

Sample Output 4

117879300

Solution in Ruby (2.3.3) (judge verdict: Accepted)

N = gets.chomp
K = gets.to_i
L = N.size

dpA = Array.new(L + 1) { Array.new([K + 1, L + 1].max, 0) }
dpB = Array.new(L + 1) { Array.new([K + 1, L + 1].max, 0) }

N.chars.map(&:to_i).each_with_index do |n, i|
  0.upto(n) do |v|
    next if i == 0 && v == 0

    if v == n
      0.upto(i) do |nonzero_count|
        if v == 0
          dpA[i + 1][nonzero_count] += dpA[i][nonzero_count]
        else
          if i == 0
            dpA[i + 1][nonzero_count + 1] += 1
          else
            dpA[i + 1][nonzero_count + 1] += dpA[i][nonzero_count]
          end
        end
      end
    else
      0.upto(i) do |nonzero_count|
        if v == 0
          dpB[i + 1][nonzero_count] += dpA[i][nonzero_count]
        else
          if i == 0
            dpB[i + 1][nonzero_count + 1] += 1
          else
            dpB[i + 1][nonzero_count + 1] += dpA[i][nonzero_count]
          end
        end
      end
    end
  end

  if i > 0
    0.upto(9) do |v|
      if v != 0
        dpB[i + 1][1] += 1
      end

      1.upto(i) do |nonzero_count|
        if v == 0
          dpB[i + 1][nonzero_count] += dpB[i][nonzero_count]
        else
          dpB[i + 1][nonzero_count + 1] += dpB[i][nonzero_count]
        end
      end
    end
  end
end

puts dpA[L][K] + dpB[L][K]