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 PHP7 (7.0.15) (judge verdict: Accepted)

<?php

fscanf(STDIN, "%s", $N);
fscanf(STDIN, "%d", $k);

$keta = strlen($N);
$ans = 0;
$map = str_split($N);
$list = [];
foreach($map as $n => $str){
    if($str != 0){
        $list[] = $keta-$n;
    }

}


if($k == 1){

    for($i=1;$i<=$keta;$i++){
        if($i != $keta){
            $ans += 9;
        }else{
            $ans += $map[0];
        }

    }
}elseif($k == 2){
    for($i=2;$i<=$keta;$i++){
        for($j = 1; $j<$i;$j++) {
            if ($i != $keta) {
                $ans += 81;
            } else {
                if (!isset($list[1])) {
//                    break;
                    $ans += ($map[0] - 1) * 9;
                } elseif ($j < $list[1]) {
                    $ans += $map[0] * 9;
                } elseif ($j == $list[1]) {
                    $ans += ($map[0] - 1) * 9 + $map[$keta - $j];
                } elseif ($j > $list[1]) {
                    $ans += ($map[0] - 1) * 9;
                }
            }
        }
    }
}elseif($k == 3){

    for($i=3;$i<=$keta;$i++){
        for($j = 2; $j<$i;$j++) {
            for($l = 1; $l < $j;$l++){
                if ($i != $keta) {
                    $ans += 729;
                } else {
                    if (!isset($list[1])) {
                        $ans += ($map[0] - 1) * 9 * 9;
                    } elseif ($j < $list[1]) {
                        $ans += $map[0] * 9 * 9;
                    } elseif ($j > $list[1]) {
                        $ans += ($map[0] - 1) * 9 * 9;
                    } elseif ($j == $list[1]) {
                        if(!isset($list[2])){
                            $ans += ($map[0] - 1) * 9 * 9 + ($map[$keta - $j] - 1) * 9;
                        }elseif($l < $list[2]){
                            $ans += ($map[0] - 1) * 9 * 9 + ($map[$keta - $j]) * 9;
                        }elseif($l > $list[2]){
                            $ans += ($map[0] - 1) * 9 * 9 + ($map[$keta - $j] - 1) * 9;
//                            break;
                        }elseif($l == $list[2]){
                            $ans += ($map[0] - 1) * 9 * 9 + ($map[$keta - $j] - 1) * 9 + $map[$keta-$l];
                        }

                    }
                }
            }
        }
    }
}

echo $ans;