Cod sursa(job #340475)

Utilizator CezarMocanCezar Mocan CezarMocan Data 14 august 2009 19:20:15
Problema Cifre Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <cstdio>

using namespace std;

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

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

inline int max(int a, int b) {
	if (a > b)
		return a;
	return b;
}

inline int f(int x) {
	int uc = (x % 10), ak = k;
	int p = x - uc, v[13];
	v[0] = 0;
	int sol = 0, aux = p;
	
	if (x == -1) 
		return 0;
	
	while (p) {
		v[0]++;
		v[v[0]] = p % 10;
		p /= 10;
	}
		
	for (i = v[0]; i > 0; i--) {
		if (c == 0 && i == v[0]) {
			sol += v[i] * z[i - 1][k];
		}
		else {
			if (v[i] > c) 
				sol += (v[i] - 1) * d[i - 1][k] + d[i - 1][max(k - 1, 0)];
			
			
			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++;
	//k = ak;
	
	return sol;
}

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