Mai intai trebuie sa te autentifici.
Cod sursa(job #930135)
Utilizator | Data | 27 martie 2013 14:21:42 | |
---|---|---|---|
Problema | Cifre | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.44 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;
}