Cod sursa(job #338973)
# include <cstdio>
using namespace std;
# define FIN "cifre.in"
# define FOUT "cifre.out"
# define max(a, b) (a > b ? a : b)
# define MAX_N 10
double Sol;
int A, B, C, K;
int Din[MAX_N][MAX_N];
int Pow[MAX_N][MAX_N];
int Comb[MAX_N][MAX_N];
void Preproc()
{
int i, j;
for (i = 0; i <= 9; ++i) Comb[i][0] = Pow[i][0] = 1;
for (i = 1; i <= 9; ++i)
for (j = 1; j <= i; ++j)
{
Pow[i][j] = Pow[i][j - 1] * i;
Comb[i][j] = Comb[i - 1][j - 1] + Comb[i - 1][j];
}
Din[0][0] = 1;
for (i = 1; i <= 9; ++i)
for (j = i; j >= 0; --j)
Din[i][j] = Din[i][j + 1] + Comb[i][j] * Pow[9][i - j];
}
int Compute(int N, int K)
{
int A[MAX_N];
int i , ct, Sol;
if (!N)
{
if (!C && K <= 1) return 1;
return 0;
}
Sol = ct = 0;
while (N)
{
A[++ct] = N % 10;
N /= 10;
}
if (!C && K <= 1) ++Sol;
for (i = 1; i < ct; ++i)
{
if (!C) Sol += 9 * Din[i - 1][K];
else Sol += Din[i - 1][max(K - 1, 0)] + 8 * Din[i - 1][K];
}
if (C && C < A[ct])
Sol += Din[ct - 1][max(K - 1, 0)] + (A[ct] - 2) * Din[ct - 1][K];
else Sol += (A[ct] - 1) * Din[ct - 1][K];
if (A[ct] == C) K = max(K - 1, 0);
for (i = ct - 1; i >= 1; --i)
{
if (C < A[i])
Sol += Din[i - 1][max(K - 1, 0)] + (A[i] - 1) * Din[i - 1][K];
else Sol += A[i] * Din[i - 1][K];
if (A[i] == C) K = max(K - 1, 0);
}
if (!K) ++Sol;
return Sol;
}
int main()
{
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
Preproc();
scanf("%d%d%d%d", &A, &B, &C, &K);
Sol = (double) Compute(B, K);
if (A) Sol -= (double) Compute(A - 1, K);
Sol /= (double) (B - A + 1);
printf("%.4f", Sol);
return 0;
}