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: Wrong Answer)


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        final Scanner in = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
        final char[] n = in.next().toCharArray();
        final int k = in.nextInt();
        if (n.length < k) {
            System.out.println(0);
            return;
        }
        System.out.println(sum(n, k, 0));
    }

    private static int sum(char[] n, int count, int index) {
        if (index >= n.length) {
            return 0;
        }
        if (n[index] == 0) {
            return sum(n, count, index + 1);
        }
        if (count == 0) {
            return 1;
        }
        final int number = n[index] - '0';
        int total = 0;
        if (count > 0 && count != n.length - index) {
            int result = combination(n.length - index - 1, count);
            for (int i = 0; i < count; i++) {
                result *= 9;
            }
            total += result;
        }
        if (number > 1) {
            int result = number - 1;
            result *= combination(n.length - index - 1, count - 1);
            for (int i = 0; i < count - 1; i++) {
                result *= 9;
            }
            total += result;
        }
        total += sum(n, count - 1, index + 1);
        return total;
    }

    private static int combination(int n, int k) {
        int top = 1;
        int bottom = 1;
        for (int i = 1; i <= k; i++) {
            bottom *= i;
            top *= n - i + 1;
        }
        return top / bottom;
    }
}