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.util.Scanner;

//AtCoder Beginner Contest 154
//E	Almost Everywhere Zero
public class Main {

	static String removeHeadZero(String N) {
		StringBuilder S = new StringBuilder();
		boolean hasNonZero = false;
		for (int i = 0; i < N.length(); i++) {
			if (!hasNonZero && N.charAt(i) - 48 != 0) {
				hasNonZero = true;
			}
			if (hasNonZero) {
				S.append(N.charAt(i));
			}
		}
		return S.toString();
	}

	static long countK1(String N) {
		String S = removeHeadZero(N);
		if (S.length() == 0) {
			return 0l;
		}
		long ans = 0;
		ans += S.charAt(0) - 48;
		ans += (S.length()-1) * 9;
		return ans;
	}

	static long countK2(String N) {
		String S = removeHeadZero(N);
		if (S.length() <= 1) {
			return 0l;
		}
 		long ans = 0;
		int first = S.charAt(0) - 48;
		StringBuilder nines = new StringBuilder();
		for (int i = 0; i < S.length()-1; i++) {
			nines.append("9");
		}
		ans += countK2(nines.toString());
		ans += (first-1) * countK1(nines.toString());
		ans += countK1(S.substring(1));
		return ans;
	}

	static long countK3(String N) {
		if (N.length() <= 2) {
			return 0l;
		}
 		long ans = 0;
		int first = N.charAt(0) - 48;
		StringBuilder nines = new StringBuilder();
		for (int i = 0; i < N.length()-1; i++) {
			nines.append("9");
		}
		ans += countK3(nines.toString());
		ans += (first-1) * countK2(nines.toString());
		ans += countK2(N.substring(1));
		return ans;
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String N = sc.next();
		int K = Integer.parseInt(sc.next());
		sc.close();

		long ans = 0;
		if (K == 1) {
			ans = countK1(N);
		}
		if (K == 2) {
			ans = countK2(N);
		}
		if (K == 3) {
			ans = countK3(N);
		}

		System.out.println(ans);
	}
}