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 (Clang 3.8.0) (judge verdict: Wrong Answer)

#include <stdio.h>
#include <string.h>
#include <limits.h>
#include <float.h>
#include <stdlib.h>
#include <math.h>

long int calc1(long int keta, long int k);
long int calc2(long int keta, long int k);

int main(void)
{
	long int i, j;
	long int k;
	long int ans = 0;
	long int count = 0;
	long int keta[3];
	char n[200];
	char ketanum[3][2];
	
	scanf("%s %ld", n, &k);
	
	for(i = 0; i < strlen(n); i++) {
		if(n[i] != '0') {
			keta[count] = strlen(n) - i;
			ketanum[count][0] = n[i];
			ketanum[count][1] = '\0';
			count++;
		}
		if(count == k) {
			break;
		}
	}
	
	if(k == 1) {
		if(strlen(n) == 1) {
			printf("%ld\n", n[0] - '0');
			return 0;
		}
		printf("%ld\n", (n[0] - '0') + calc2(keta[0] - 1, 1));
		return 0;
	} else if(k == 2) {
		if(strlen(n) < 2) {
			printf("0\n");
			return 0;
		}
		ans = (ketanum[1][0] - '0') + calc2(keta[1] - 1, 1);
		ans += (ketanum[0][0] - '1') * calc2(keta[0] - 1, 1);
		for(i = keta[0] - 1; i > 1; i--) {
			ans += calc1(i, 2);
		}
		printf("%ld\n", ans);
		return 0;
	} else {
		if(strlen(n) < 3) {
			printf("0\n");
			return 0;
		}
		ans = (ketanum[2][0] - '0') + calc2(keta[2] - 1, 1);
		ans += (ketanum[1][0] - '1') * calc2(keta[1] - 1, 1) + calc2(keta[1] - 1, 2);
		ans += (ketanum[0][0] - '1') * calc2(keta[0] - 1, 2);
		for(i = keta[0] - 1; i > 2; i--) {
			ans += calc1(i, 3);
		}
		printf("%ld\n", ans);
		return 0;
	}
	
	return 0;
}
//最上位桁が必要
long int calc1(long int keta, long int k)
{
	if(k == 1) {
		return 9;
	} else if(k == 2) {
		return 9 * 9 * (keta - 1);
	} else {
		return 9 * calc2(keta - 1, 2);
	}
}

//最上位桁が必要ない
long int calc2(long int keta, long int k)
{
	if(k == 1) {
		return 9 * keta;
	} else if(k == 2) {
		return 9 * 9 * keta * (keta - 1) / 2;
	} else {
		return 9 * 9 * 9 * keta * (keta - 1) * (keta - 2) / 6;
	}
}