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 Java8 (OpenJDK 1.8.0) (judge verdict: Accepted)

import java.io.InputStream;
import java.io.PrintStream;
import java.util.Scanner;

public class Main {

  public static void main(String[] args) {
    resolve(System.in, System.out);
  }

  static final int SAME_AS_N_SO_FAR = 0;
  static final int LESS_THAN_OR_EQ_N = 1;

  static void resolve(InputStream is, PrintStream pw) {
    Scanner sc = new Scanner(is);
    String n = sc.next();
    int t = Integer.valueOf(sc.next());
    int[][][] dp = new int[n.length() + 1][t + 1][LESS_THAN_OR_EQ_N + 1];
    dp[0][0][SAME_AS_N_SO_FAR] = 1;
    for (int i = 0; i < n.length(); i++) {
      for (int j = 0; j <= t; j++) {
        for (int k = SAME_AS_N_SO_FAR; k <= LESS_THAN_OR_EQ_N; k++) {
          int nd = Integer.parseInt(String.valueOf(n.charAt(i)));
          for (int d = 0; d < 10; d++) {
            int ni = i + 1;
            int nj = j;
            int nk = k;
            if (d != 0) {
              nj++;
            }
            if (nj > t) {
              continue;
            }
            if (k == SAME_AS_N_SO_FAR) {
              if (d < nd) {
                nk = LESS_THAN_OR_EQ_N;
              }
              if (d > nd) {
                continue;
              }
            }
            dp[ni][nj][nk] += dp[i][j][k];
          }
        }
      }
    }
    int ans = dp[n.length()][t][0] + dp[n.length()][t][1];
    pw.println(ans);
  }
}