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<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<iomanip>
#include<math.h>
#include<complex>
#include<queue>
#include<deque>
#include<stack>
#include<map>
#include<set>
#include<bitset>
#include<functional>
#include<assert.h>
#include<numeric>
using namespace std;
#define REP(i,m,n) for(int i=(int)(m) ; i < (int) (n) ; ++i )
#define rep(i,n) REP(i,0,n)
#define pll pair<ll,ll>
#define pint pll
using ll = long long;
const int inf=1e9+7;
const ll longinf=1LL<<60 ;
const ll mod=1e9+7 ;

ll binomial(int64_t N, int64_t K) {
  if(K < 0 || N < K) return 0;
  ll ret = 1;
  for(ll i = 1; i <= K; ++i) {
    ret *= N--;
    ret /= i;
  }
  return ret;
}

ll dfs(string t,int x){
  ll ret=0;
  int len=t.size();
  if(t.size()<x){
    return 0LL;
  }
  if(x==0 || t.size()==0)return 1;
  string temp="";
  rep(i,t.size()){
    if(i!=0)temp+=t[i];
  }  
  if(t[0]=='0'){
    return dfs(temp,x);
  }
  if(t.size()==1 && x==1){
    return (ll)(t[0]-'0');
  }
  ll te=1;
  rep(i,x)te*=9;
  ret+=te/9*binomial(len-1,x-1)*(t[0]-'0'-1);
  ret+=te*binomial(len-1,x);
  return ret+dfs(temp,x-1);
}

int main(){
  string s;
  cin >> s;
  int k;
  cin >> k;
  ll ans=1;
  rep(i,k)ans*=9;
  ll n=s.size();
  cout << dfs(s,k) << endl;
return 0;}