Pagini recente » Cod sursa (job #784558) | Cod sursa (job #2042989) | Cod sursa (job #339568) | Cod sursa (job #2400444) | Cod sursa (job #340180)
Cod sursa(job #340180)
#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));
}