Cod sursa(job #431157)

Utilizator savimSerban Andrei Stan savim Data 31 martie 2010 18:40:40
Problema Cifre Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <stdio.h>

int a, b, c, k;
int d[15][15][15];

void calc_din() {
    for (int i = 1; i <= 10; i++)
        if (i - 1 != c) d[i][0][0] = d[i - 1][0][0] + 1;
        else d[i][0][0] = d[i - 1][0][0];

    for (int i = c + 1; i <= 10; i++)
        d[i][0][1] = 1;

    for (int i = 1; i < 9; i++)
		for (int j = 1; j <= 9; j++)
			for (int t = 0; t <= 9; t++)
				if (j == 1) {
					int x = 0;
					for (int L = i - 1; L >= 0; L--) {
						d[j][i][t] += d[9][L][t - x];

						if (c == 9) x++;
						if (x > t) break;
					}

					if (c != 9 && t == 0) d[j][i][t]++;
					if (c == 9 && t == i) d[j][i][t]++;
				}
				else {
					if (j == c + 1 && t == i + 1) d[j][i][t]++; //adaug numarul "ccccc" de i + 1 ori

					d[j][i][t] = d[j - 1][i][t];
					if (t - (j - 1 == c) >= 0) d[j][i][t] += d[1][i][t - (j - 1 == c)];
				}
}

int solve(int x) {
	if (x == 0) return d[1][0][k];

	int cif[12] = {0,0,0,0,0,0,0,0,0,0,0}, sol = 0, nr = k, p10 = 0;
	while (x) {
    	cif[++cif[0]] = x % 10;
		x /= 10; p10++;
	}

	for (int i = cif[0]; i > 0; i--) 
		if (i == 1) {
			if (cif[i] > 0)
				for (int j = nr; j <= 9; j++)
					sol = sol + d[cif[i] + 1][0][j];
		}
		else {
			for (int j = nr; j <= 9; j++)
	        	sol = sol + d[cif[i]][p10 - 1][j];
			p10--;
			if (cif[i] == c) nr--;
		}

	return sol;
}

int main() {
	freopen("cifre.in", "r", stdin);
	freopen("cifre.out", "w", stdout);

	scanf("%d %d %d %d", &a, &b, &c, &k);

	calc_din();

	printf("%.4lf\n", 1.0 * (solve(b) - solve(a - 1)) / (b - a + 1));

	return 0;
}