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.42.0) (judge verdict: Accepted)

#![allow(unused_imports)]
use std::cmp::*;
use std::collections::*;
use itertools::Itertools;
use num::clamp;
use proconio::{input, marker::*, fastout};
use superslice::*;

#[fastout()]
fn main() {
    input! {
        n: Bytes,
        k: usize,
    }

    let n = n.iter().map(|&c| (c - b'0') as usize).collect_vec();
    let l = n.len();

    let mut dp = vec![vec![vec![0; l]; k+1]; 2];
    dp[0][0] = vec![1; l];
    dp[0][0][l-1] = 0;
    dp[0][1][0] = n[0] - 1;
    dp[1][1][0] = 1;
    for i in 1..l {
        for j in 1..=k {
            dp[0][j][i] += dp[0][j-1][i-1] * 9;
            dp[0][j][i] += dp[0][j][i-1];
            if n[i] != 0 {
                dp[0][j][i] += dp[1][j-1][i-1] * (n[i] - 1);
                dp[0][j][i] += dp[1][j][i-1];
                dp[1][j][i] += dp[1][j-1][i-1];
            } else {
                dp[1][j][i] += dp[1][j][i-1];
            }
        }
    }
    println!("{}", dp[0][k][l-1] + dp[1][k][l-1]);
}