Pagini recente » Cod sursa (job #170258) | Cod sursa (job #1030160) | Cod sursa (job #1030299) | Cod sursa (job #3153065) | Cod sursa (job #1629137)
#include <iostream>
#include <cstdio>
#define MAXCIF 11
using namespace std;
int a, b, c, k, rez;
int din[MAXCIF][MAXCIF]; /// nr de numere mai mici decat 10^i care au exact j cifre c
void prepare()
{
din[1][1] = 1;
din[1][0] = 9;
for (int i = 2; i < MAXCIF; i++)
for (int j = 0; j < MAXCIF; j++)
din[i][j] = 9 * din[i-1][j] + (j == 0 ? 0 : din[i-1][j-1]);
}
int nrcif(int x)
{
int r = 0;
do {
r++;
x/= 10;
}while (x);
return r;
}
int solve(int nr, int cate)
{
if (nr < 10) {
if (cate == 1 && nr > c)
return 1;
if (cate == 0)
return nr+(nr <= c)-1;
return 0;
}
int p = nrcif(nr)-1;
int ten = 1;
for (int i = 1; i <= p; i++) ten*=10;
if (nr == ten)
return din[p][cate];
int x = (nr%ten) + ten*(nr%ten == 0);
return solve(nr-x, cate) + solve(x, cate-((nr-1)/ten == c));
}
int get(int x)
{
int ret = 0;
for (int i = k; i <= nrcif(x); i++)
ret += solve(x, i);
return ret;
}
int main()
{
freopen("cifre.in", "r", stdin);
freopen("cifre.out", "w", stdout);
scanf("%d %d %d %d", &a, &b, &c, &k);
prepare();
rez = get(b+1) - get(a);
printf("%.4lf", (1.0*rez)/(b-a+1));
return 0;
}