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 C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
class Program
{
	static void Main(string[] args)
	{
		string N = Console.ReadLine();
		int K = int.Parse(Console.ReadLine());
		long[,]D0 = new long[N.Length+1,5];
		long[,]D1 = new long[N.Length+1,5];
		D1[0,0] = 1;
		for(var i=0;i<N.Length;i++){
			int n1 = int.Parse(N.Substring(i,1));
			for(var j=0;j<5;j++){
				D0[i+1,j] += D0[i,j];
				if(n1>=1){
					D0[i+1,j] += D1[i,j];
				} else {
					D1[i+1,j] += D1[i,j];
				}
			}
			for(var j=1;j<5;j++){
				D0[i+1,j] += D0[i,j-1] * 9;
				if(n1>=1){
					D1[i+1,j] += D1[i,j-1];
					D0[i+1,j] += D1[i,j-1] * (n1-1);
                }
			}
		}
		for(var i=0;i<=N.Length;i++){
			for(var j=0;j<5;j++){
              Console.Error.Write(D0[i,j]+" ");
            }
			for(var j=0;j<5;j++){
              Console.Error.Write(D1[i,j]+" ");
            }
          	Console.Error.WriteLine();
		}
		Console.WriteLine(D0[N.Length,K]+D1[N.Length,K]);
	}
}