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 Rust (1.15.1) (judge verdict: Accepted)

use std::io::Read;

fn run() {
    let mut s = String::new();
    std::io::stdin().read_to_string(&mut s).unwrap();
    let mut it = s.trim().split_whitespace();
    let s: Vec<usize> = it.next().unwrap().chars().map(|c| c.to_digit(10).unwrap() as usize).collect();
    assert!(s[0] != 0);
    let k: usize = it.next().unwrap().parse().unwrap();
    let mut dp = vec![0usize; k + 2];
    dp[0] = 1;
    for _ in 1..s[0] {
        dp[1] += 1;
    }
    let mut sup = 1;
    for &d in s.iter().skip(1) {
        let mut next = vec![0; k + 2];
        for i in 0..(k + 1) {
            for _ in 1..10 {
                next[i + 1] += dp[i];
            }
            next[i] += dp[i];
        }
        if d > 0 && sup <= k {
            next[sup] += 1;
        }
        if sup + 1 <= k {
            for _ in 1..d {
                next[sup + 1] += 1;
            }
        }
        if d > 0 {
            sup += 1;
        }
        dp = next;
    }
    let mut ans = dp[k];
    if sup == k {
        ans += 1;
    }
    println!("{}", ans);
}

fn main() {
    run();
}