Cod sursa(job #340408)

Utilizator CezarMocanCezar Mocan CezarMocan Data 14 august 2009 16:24:22
Problema Cifre Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <cstdio>

using namespace std;

int a, b, c, k, l;
int i, j;
double s;
int d[10][10], z[10][10];

inline int nr(int x, int c) {
	int t = 0;
	while (x) {
		if (x % 10 == c)
			t++;
		x /= 10;
	}
	return t;
}

inline int f(int x) {
	int uc = (x % 10), ak = k;
	int p = x - uc, v[10];
	v[0] = 0;
	int sol = 0, aux = p;
	
	while (p) {
		v[0]++;
		v[v[0]] = p % 10;
		p /= 10;
	}
		
	for (i = v[0]; i > 0; i--) {
		if (v[i] > c) 
			sol += (v[i] - 1) * d[i - 1][k] + d[i - 1][k - 1];
		
		
		if (v[i] < c) 
			sol += v[i] * d[i - 1][k];
		
		
		if (v[i] == c) {
			sol += v[i] * d[i - 1][k];
			k--;
			if (k < 0)
				k = 0;
		}
	}
	
	k = ak;
	
	for (i = aux; i <= aux + uc; i++)
		if (nr(i, c) >= k)
			sol++;
	
	return sol;
}

int main() {
	freopen("cifre.in", "r", stdin);
	freopen("cifre.out", "w", stdout);
	
	scanf("%d%d%d%d", &a, &b, &c, &k);
	if (c == 0)
		while (1);
	
	d[0][0] = 1;
	for (i = 1; i <= 9; i++)
		for (j = 0; j <= i; j++)
			d[i][j] = d[i - 1][j] * 9 + d[i - 1][j - 1];
		
	for (i = 1; i <= 9; i++)
		for (j = i; j >= 0; j--)
			d[i][j] += d[i][j + 1];
		
/*	for (i = 1; i <= 9; i++)
		for (j = i; j >= 0; j--)
			d[i][j] += d[i - 1][j];*/
	f(13);
	l = b - a + 1;
	s = f(b) - f(a - 1);
	
	printf("%lf\n", s / (1.0 * l));
	
	return 0;
}