Pagini recente » Cod sursa (job #1603828) | Cod sursa (job #963780) | Cod sursa (job #963224) | Cod sursa (job #387599) | Cod sursa (job #431157)
Cod sursa(job #431157)
#include <stdio.h>
int a, b, c, k;
int d[15][15][15];
void calc_din() {
for (int i = 1; i <= 10; i++)
if (i - 1 != c) d[i][0][0] = d[i - 1][0][0] + 1;
else d[i][0][0] = d[i - 1][0][0];
for (int i = c + 1; i <= 10; i++)
d[i][0][1] = 1;
for (int i = 1; i < 9; i++)
for (int j = 1; j <= 9; j++)
for (int t = 0; t <= 9; t++)
if (j == 1) {
int x = 0;
for (int L = i - 1; L >= 0; L--) {
d[j][i][t] += d[9][L][t - x];
if (c == 9) x++;
if (x > t) break;
}
if (c != 9 && t == 0) d[j][i][t]++;
if (c == 9 && t == i) d[j][i][t]++;
}
else {
if (j == c + 1 && t == i + 1) d[j][i][t]++; //adaug numarul "ccccc" de i + 1 ori
d[j][i][t] = d[j - 1][i][t];
if (t - (j - 1 == c) >= 0) d[j][i][t] += d[1][i][t - (j - 1 == c)];
}
}
int solve(int x) {
if (x == 0) return d[1][0][k];
int cif[12] = {0,0,0,0,0,0,0,0,0,0,0}, sol = 0, nr = k, p10 = 0;
while (x) {
cif[++cif[0]] = x % 10;
x /= 10; p10++;
}
for (int i = cif[0]; i > 0; i--)
if (i == 1) {
if (cif[i] > 0)
for (int j = nr; j <= 9; j++)
sol = sol + d[cif[i] + 1][0][j];
}
else {
for (int j = nr; j <= 9; j++)
sol = sol + d[cif[i]][p10 - 1][j];
p10--;
if (cif[i] == c) nr--;
}
return sol;
}
int main() {
freopen("cifre.in", "r", stdin);
freopen("cifre.out", "w", stdout);
scanf("%d %d %d %d", &a, &b, &c, &k);
calc_din();
printf("%.4lf\n", 1.0 * (solve(b) - solve(a - 1)) / (b - a + 1));
return 0;
}