Pagini recente » Cod sursa (job #1020907) | Cod sursa (job #1328704) | Cod sursa (job #688023) | Cod sursa (job #2963601) | Cod sursa (job #800721)
Cod sursa(job #800721)
#include <cassert>
#include <cstdio>
#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) {
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 sola = 0;
int na = digits(a);
for (int j = K; j <= na; ++j) {
sola += d[na][j][0][1] + d[na][j][1][1];
}
int solb = 0;
for (int j = K; j <= n; ++j)
solb += d[n][j][0][1] + d[n][j][1][1];
if (c == 0) {
++sola;
++solb;
}
return solb - sola + 1;
}
int main() {
read();
//b = 99;
//c = 2;
//K = 1;
printf("%lf\n", dinamica(b) / (b - a + 1.0));
}