Pagini recente » Cod sursa (job #2087652) | Cod sursa (job #2490191) | Cod sursa (job #347232) | Cod sursa (job #2314150) | Cod sursa (job #1044210)
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int a,b,c,k;
int DP[20][20][5];
int digit[20];
int solve(int lim){
int many = 0,cpy = lim;
while(cpy){
++many;
digit[many] = cpy % 10;
cpy /= 10;
}
reverse(digit + 1, digit + many + 1);
memset(DP, 0, sizeof(DP));
DP[0][0][1] = 1;
for(int i = 0 ; i <= many ; ++i){
for(int j = 0 ; j <= many ; ++j){
for(int p = 0 ; p <= 1 ; ++p){
if(p == 0){
DP[i+1][j][p] += DP[i][j][p] * 9;
DP[i+1][j+1][p] += DP[i][j][p];
} else {
int mx = digit[i+1];
if(c > mx){
DP[i+1][j][p] += DP[i][j][p];
DP[i+1][j][0] += DP[i][j][p] * mx;
} else if (c == mx){
DP[i+1][j+1][p] += DP[i][j][p];
DP[i+1][j][0] += DP[i][j][p] * mx;
} else {
DP[i+1][j][p] += DP[i][j][p];
DP[i+1][j+1][0] += DP[i][j][p];
DP[i+1][j][0] += DP[i][j][p] * (mx - 1);
}
}
}
}
}
int ret = 0;
for(int j = k ; j <= many ; ++j)
ret += DP[many][j][0] + DP[many][j][1];
return ret;
}
int main(){
freopen("cifre.in", "r", stdin);
scanf("%d%d%d%d", &a, &b, &c, &k);
int tot = solve(b) - solve(a - 1);
double rez = tot;
rez /= 1.0 * (b - a + 1);
freopen("cifre.out", "w", stdout);
printf("%lf", rez);
}