Pagini recente » Cod sursa (job #1948040) | Cod sursa (job #2531837) | Cod sursa (job #2234945) | Cod sursa (job #1088614) | Cod sursa (job #1303540)
#include <fstream>
#include <cstdio>
using namespace std;
const int MAX_N = 12;
int A, B, C, K;
int D[MAX_N][MAX_N];
int solve(int n, int k) {
if(n < 0)
return 0;
if(n == 0) {
if(k == 1 && C == 0)
return 1;
else return 0;
}
int nr = 0;
int a[MAX_N];
while(n) {
a[++nr] = n % 10;
n /= 10;
}
for(int i = 1, j = nr; i < j; ++i, --j)
swap(a[i], a[j]);
int ret = 0, cnt = 0;
for(int i = 1; i <= nr; ++i) {
int t = 1;
if(i == nr)
t = 0;
for(int j = 0; j <= a[i] - t; ++j) {
if(j == C) {
if(i == 1 && j == 0)
continue;
if(cnt < k)
ret += D[nr - i][k - cnt - 1];
}
else ret += D[nr - i][k - cnt];
}
if(a[i] == C)
++cnt;
if(cnt > k)
break;
}
return ret;
}
int main() {
freopen("cifre.in", "r", stdin);
freopen("cifre.out", "w", stdout);
scanf("%d %d %d %d", &A, &B, &C, &K);
D[1][0] = 9;
D[1][1] = 1;
D[0][0] = 1;
for(int i = 2; i <= 10; ++i)
for(int j = 0; j <= i; ++j) {
D[i][j] = D[i - 1][j] * 9;
if(j > 0)
D[i][j] += D[i - 1][j - 1];
}
int a = 0, b = B - A + 1;
for(int i = K; i <= 10; ++i)
a += solve(B, i) - solve(A - 1, i);
if(K == 0)
a = b;
printf("%.4lf\n", (double) a / b);
fclose(stdin);
fclose(stdout);
return 0;
}