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.BufferedInputStream;
import java.math.BigInteger;
import java.util.Scanner;

public class Main {

    public static long fun1(BigInteger a){
        String r=a+"";
        if(a.compareTo(BigInteger.TEN)<=0)
            return Long.valueOf(r);
        else{
            long p=0;
            p+=(r.length()-1)*9;
            p+=Integer.parseInt(r.charAt(0)+"");
            return p;
        }
    }

    public static long fun2(BigInteger a){
        String r=a+"";
        if(a.compareTo(BigInteger.TEN)<=0)
            return 0;
        else{
            long p = (Integer.parseInt(r.charAt(0) + "") - 1) * 9 * (r.length() - 1);
            p += (r.length() - 2) * (r.length() - 1) / 2 * 9 * 9;
            r=r.substring(1);
            a=new BigInteger(r);
            p+= Main.fun1(a);
            return p;
        }
    }


    public static void main(String[] args) {
        Scanner sc=new Scanner(new BufferedInputStream(System.in));
        BigInteger a=sc.nextBigInteger();
        BigInteger c=new BigInteger("110");
        String r=a+"";
        int k=sc.nextInt();
        if(k==1)
            System.out.println( Main.fun1(a));
        if(k==2)
            System.out.println( Main.fun2(a));
        if(k==3){
            if(a.compareTo(c)==-1)
                System.out.println("0");
            else{
                long q = 0;
                long v = (r.length() - 1) * (r.length() - 2) * (r.length() - 3) / 6 * 9 * 9 * 9;
                v += 9 * 9 * (Integer.parseInt(r.charAt(0) + "") - 1) * (r.length() - 1) * (r.length() - 2) / 2;
                r = r.substring(1);
                a=new BigInteger(r);
                v+= Main.fun2(a);
                System.out.println(v);
            }
        }
    }
}