Pagini recente » Cod sursa (job #667109) | Cod sursa (job #340181) | Cod sursa (job #978614) | Cod sursa (job #1394657) | Cod sursa (job #340408)
Cod sursa(job #340408)
#include <cstdio>
using namespace std;
int a, b, c, k, l;
int i, j;
double s;
int d[10][10], z[10][10];
inline int nr(int x, int c) {
int t = 0;
while (x) {
if (x % 10 == c)
t++;
x /= 10;
}
return t;
}
inline int f(int x) {
int uc = (x % 10), ak = k;
int p = x - uc, v[10];
v[0] = 0;
int sol = 0, aux = p;
while (p) {
v[0]++;
v[v[0]] = p % 10;
p /= 10;
}
for (i = v[0]; i > 0; i--) {
if (v[i] > c)
sol += (v[i] - 1) * d[i - 1][k] + d[i - 1][k - 1];
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++;
return sol;
}
int main() {
freopen("cifre.in", "r", stdin);
freopen("cifre.out", "w", stdout);
scanf("%d%d%d%d", &a, &b, &c, &k);
if (c == 0)
while (1);
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];
for (i = 1; i <= 9; i++)
for (j = i; j >= 0; j--)
d[i][j] += d[i][j + 1];
/* for (i = 1; i <= 9; i++)
for (j = i; j >= 0; j--)
d[i][j] += d[i - 1][j];*/
f(13);
l = b - a + 1;
s = f(b) - f(a - 1);
printf("%lf\n", s / (1.0 * l));
return 0;
}