Cod sursa(job #340180)

Utilizator raduzerRadu Zernoveanu raduzer Data 13 august 2009 15:31:05
Problema Cifre Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include <cstdio>

const int NR = 100000;
const int MAX_N = 100010;
const int MAX_C = 10;

int a, b, c, k;
int nr[MAX_C], nr0[MAX_C];
int d[MAX_N], d0[MAX_N];

int cf(int x)
{
	if (!x) return 1;
	int ret = 0;

	while (x)
	{
		++ret;
		x /= 10;
	}

	return ret;
}

int f(int x)
{
	int ret = 0, i;

	for (i = 0; i < x / NR; ++i)
	{
		int z = k - d[i];
		if (z < 0) z = 0;

		if (!c && !i)
			ret += nr[k];
		if (!c && i)
			ret += nr0[z];
		if (c)
			ret += nr[z];
	}

	int p = d[x / NR];

	if (!c && !(x / NR))
		p = 0;

	for (i = 0; i <= x % NR; ++i)
		if (c || !i)
		{
			if (p + d[i] >= k) ++ret;
		}
		else
			if (p + d0[i] >= k) ++ ret;

	return ret;
}

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

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

	for (i = 0; i < NR; ++i)
	{
		if (i > 9) 
			d[i] = d[i / 10] + (i % 10 == c);
		else
			d[i] = (i == c);

		d0[i] = 5 - cf(i) + d[i];

		++nr[d[i]];
		++nr0[d0[i]];
	}

	for (i = 5; i; --i)
		nr[i - 1] += nr[i], nr0[i - 1] += nr[i];

	printf("%.7lf\n", (double)(f(b) - f(a - 1)) / (b - a + 1));
}