Cod sursa(job #228608)

Utilizator ProtomanAndrei Purice Protoman Data 7 decembrie 2008 16:40:07
Problema Cifre Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <stdio.h>
#include <algorithm>
#define limit 100000

using namespace std;

int a, b, c, k;
int apar[limit + 4], ap0[limit + 4];
int me[16], me0[16];

int nrcf(int x)
{
	int f_rez = 0;
	if (!x)
		return 1;
	for (; x; x /= 10, f_rez++);
	return f_rez;
}

int calc(int x)
{
	int f_rez = 0, av;
	for (int i = 0; i < x / limit; i++)
	{
		av = max(0, k - apar[i]);
		if (c == 0 && i == 0)
			f_rez += me[k];
		else if (c == 0)
			f_rez += me0[av];
		else f_rez += me[av];
	}
	av = max(0, apar[x / limit]);
	if (c == 0 && x / limit == 0)
		av = 0;
	for (int i = 0; i <= x % limit; i++)
		if (c || !i)
		{
			if (av + apar[i] >= k)
				f_rez++;
		}
		else if (av + ap0[i] >= k)
			f_rez++;
	return f_rez;
}

int main()
{
	freopen("cifre.in","r",stdin);
	freopen("cifre.out","w",stdout);
	scanf("%ld %ld %ld %ld", &a, &b, &c, &k);
	for (int i = 0; i < limit; me[apar[i]]++, me0[ap0[i]]++, i++)
	{
		if (i > 9)
			apar[i] = apar[i / 10] + (i % 10 == c);
		else apar[i] = (i % 10 == c);
		ap0[i] = 5 - nrcf(i) + apar[i];
	}
	for (int i = 5; i; me[i - 1] += me[i], me0[i - 1] += me0[i], i--);
	printf("%.7lf\n", (double) (calc(b) - calc(a - 1)) / (b - a + 1));
	fclose(stdin);
	fclose(stdout);
	return 0;
}