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;

typedef long long ll;

template<typename T>
void out(T x) { cout << x << endl; exit(0); }
#define watch(x) cout << (#x) << " is " << (x) << endl

const int maxn = 110;


int n;
string s;
int k;

ll cache[maxn][5][3][3];

ll dfs(int i, int nonz, bool lower, bool f) {
  if (nonz > k) return 0;
  if (i == n) {
    return (nonz == k);
  } else {
    if (cache[i][nonz][lower][f] != -1) {
      return cache[i][nonz][lower][f];
    }
    ll res = 0;
    int dig = s[i]-'0';
    for (int d=(f ? 1: 0); d<=(lower ? 9 : dig); d++) {
      res += dfs(i + 1, nonz + (d>0), lower || (d<dig), false);
    }
    return cache[i][nonz][lower][f] = res;
  }
}

int main() {
  ios_base::sync_with_stdio(false); cin.tie(0);  cout.tie(0);

  memset(cache, -1, sizeof cache);
  
  cin>>s>>k;
  n = s.length();
  ll ans = 0;

  for (int i=0; i<n; i++) {
    ans += dfs(i, 0, i>0, true);
  }

  cout<<ans<<endl;
  return 0;
}