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++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h>
//#include <ext/pb_ds/tree_policy.hpp>
//#include <ext/pb_ds/assoc_container.hpp>

using namespace std;
//using namespace __gnu_pbds;

#define LL       long long
#define DS       pair<int, int>
#define READ(f)  freopen(f, "r", stdin)
#define WRITE(f) freopen(f, "w", stdout)

const int N = 105;
const int MOD = 1e9 + 7;
const double PI = 2 * acos(0.0);
//template<typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

string s;
LL k, dp[N][5][2];

int fun(int pos, int cnt, int small) {
    if (cnt > k) {
        return 0;
    }
    if (pos == s.size()) {
        return cnt == k;
    }
    LL &tmp = dp[pos][cnt][small];
    if (tmp != -1) {
        return tmp;
    }
    tmp = 0;
    int j = small ? 9 : s[pos] - '0';
    for (int i = 0; i <= j; i++) {
        tmp += fun(pos + 1, (i != 0) + cnt, i < j ? 1 : small);
    }
    return tmp;
}

int main() {
    //ios::sync_with_stdio(false);
    //cin.tie(0);
    cin >> s >> k;
    memset(dp, -1, sizeof dp);
    cout << fun(0, 0, 0) << '\n';
    return 0;
}