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>
using namespace std;
 
#define pb push_back
#define ll long long
#define maxn 200005
#define fr(i,j,k) for(int i=j;i<k;i++)
#define f(n) fr(i,0,n)
#define f1(n) fr(i,1,n+1)
#define ms(i) memset(i,0,sizeof(i));
#define ms1(i) memset(i,-1,sizeof(i));
#define F first
#define S second
string s;
int k;
ll dp[105][2][4];
int a[105];
ll dfs(int pos,int lim,int cur){
    if(cur > k)return 0;
    if(pos == -1 && cur == k){
        return 1;
    }
    else if(pos == -1){
        return 0;
    }
    if(~dp[pos][lim][cur])return dp[pos][lim][cur];
    int ub = lim ? a[pos] : 9;
    ll ans = 0;
    for(int i = 0 ; i <= ub ; i ++){
        ans += dfs(pos-1,lim&&i==ub,cur+(i!=0));
    }
    return dp[pos][lim][cur] = ans;
}
ll solve(){
    cin >> s >> k;
    memset(dp, -1, sizeof(dp));
    int pos;
    pos = 0;
    while(s.size()){
        a[pos] = s.back() - '0';
        s.pop_back();
        pos++;
    }
    return dfs(pos-1,1,0);
}
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout << solve() << '\n';
}