Pagini recente » Cod sursa (job #426417) | Cod sursa (job #1949375) | Cod sursa (job #2474750) | Cod sursa (job #2174165) | Cod sursa (job #1599991)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int A, B, C, K;
int D[13][13][2][2];
int solve(int x) {
memset(D, 0, sizeof(D));
int v[13];
int digits = 0;
while (x) {
v[++digits] = x % 10;
x /= 10;
}
reverse(v + 1, v + digits + 1);
D[0][0][1][1] = 1;
for (int i = 0; i <= digits; i++) {
for (int j = 0; j <= i; j++) {
for (int k = 0; k < 2; k++) { // all zeros
for (int l = 0; l < 2; l++) { // all equal
for (int d = 0; d <= 9; d++) {
if (l == 1 && d > v[i + 1])
continue;
int i1, j1, k1, l1;
i1 = i + 1;
j1 = j + ((d == C) ? 1 : 0);
if (k == 1 && C == 0 && C == d) {
j1--;
}
if (d == 0 && k == 1)
k1 = 1;
else
k1 = 0;
if (d == v[i + 1] && l == 1)
l1 = 1;
else
l1 = 0;
D[i1][j1][k1][l1] += D[i][j][k][l];
}
}
}
}
}
int ans = 0;
for (int k = K; k <= digits; k++) {
ans += D[digits][k][0][1] + D[digits][k][0][0];
}
return ans;
}
int main() {
freopen("cifre.in", "r", stdin);
freopen("cifre.out", "w", stdout);
scanf("%d %d %d %d", &A, &B, &C, &K);
long long cnt = solve(B) - solve(A - 1);
double ans = 1. * cnt / (B - A + 1);
printf("%.4lf\n", ans);
return 0;
}