Pagini recente » Cod sursa (job #692995) | Cod sursa (job #3199491) | Cod sursa (job #1658706) | Cod sursa (job #776696) | Cod sursa (job #1044220)
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int a,b,c,k;
int DP[20][20][2][2];
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][0] = 1;
for(int i = 0 ; i <= many ; ++i){
for(int j = 0 ; j <= many ; ++j){
for(int p = 0 ; p <= 1 ; ++p){
for(int l = 0 ; l <= 1 ; ++l){
for(int d = 0 ; d <= 9 ; ++d){
if(p == 1 && d > digit[i + 1])
break;
int _i, _j, _p, _l;
_i = i + 1;
_j = j + ( (d == c) && (c || l) );
_p = p && (d == digit[_i]);
_l = l || d;
DP[_i][_j][_p][_l] += DP[i][j][p][l];
}
}
}
}
}
int ret = 0;
for(int j = k ; j <= many ; ++j)
ret += DP[many][j][0][1] + DP[many][j][1][1];
return ret + (c == 0);
}
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);
}