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: Wrong Answer)

#include <bits/stdc++.h>
using namespace std;
 
int main(){
 string N;
 int K;
 int i;
 cin >> N >> K;
 long long int ans = 0;
 if(K==1){
     ans = (N.length()-1)*9 + (N[0]-'0');
 }
else if(K==2){
    ans = ((N.length()-1)*(N.length()-2)*81/2);
    ans += (N[0]-'0'-1)*(N.length()-1)*9;
    int find = 0;
    for(i=1;i<N.length();i++){
        if(N[i]-'0'>0){
            find=i;
            break;
        }
    }
    if(find>0)ans += (N.length()-find-1)*9+(N[find]-'0');
}
else if(K==3){
    ans = ((N.length()-1)*(N.length()-2)*(N.length()-3)*243/2);
    int find1 = 0;
    int find2 = 0;
    for(i=1;i<N.length();i++){
        if(N[i]-'0'>0 && find1>0){
            find2=i;
            break;
        }
        else if(N[i]-'0'>0 && find1==0)find1=i;
    }    
    if(find1>0 && find1<N.length()-2){
        ans += (N.length()-find1-2)*(N.length()-find1-3)*81/2;
        ans += (N[find1]-'0'-1)*(N.length()-find1-1)*9;
        if(find2>0)ans += (N.length()-find2-1)*9+(N[find2]-'0');
    }
    else if(find1>0&&find1>=N.length()-2){
        int count = (N[N.length()-2]-'0')*10+(N[N.length()-1]-'0');
        int zero =0;
        int cope = count;
        cope/=10;
        ans += (count - cope);
    }
    }
 cout << ans << endl;
 }