Pagini recente » Cod sursa (job #1290161) | Cod sursa (job #241496) | Cod sursa (job #1018085) | Cod sursa (job #46089) | Cod sursa (job #835326)
Cod sursa(job #835326)
#include <cassert>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 15;
int a, b, c, k, K;
int d[N][N][2][2];
vector <int> nrb;
void read() {
assert(freopen("cifre.in", "r", stdin) != NULL);
assert(freopen("cifre.out", "w", stdout) != NULL);
assert(scanf("%d %d %d %d", &a, &b, &c, &K) == 4);
}
int digits(int x) {
int ans = 0;
nrb.clear();
do {
++ans;
nrb.push_back(x % 10);
x /= 10;
}while (x);
reverse(nrb.begin(), nrb.end());
return ans;
}
int dinamica(int b) {
memset(d, 0, sizeof(d));
int n = digits(b);
d[0][0][1][0] = 1;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
for (int k = 0; k <= 1; ++k) {
for (int l = 0; l <= 1; ++l) {
for (int digit = 0; digit <= 9; ++digit) {
if (k == 1 && digit > nrb[i])
continue;
int new_i = i + 1;
int new_j = j;
if (digit == c && (c != 0 || l == 1))
++new_j;
int new_k = 0;
if (k == 1 && digit == nrb[i])
new_k = 1;
int new_l = 1;
if (l == 0 && digit == 0)
new_l = 0;
d[new_i][new_j][new_k][new_l] += d[i][j][k][l];
}
}
}
}
}
int sol = 0;
for (int j = K; j <= n; ++j)
sol += d[n][j][0][1] + d[n][j][1][1];
if (c == 0) {
++sol;
}
return sol;
}
int main() {
read();
printf("%lf\n", (dinamica(b) - dinamica(a - 1)) / (b - a + 1.0));
}