Pagini recente » Cod sursa (job #1573596) | Cod sursa (job #1030820) | Cod sursa (job #192183) | Cod sursa (job #54678) | Cod sursa (job #1583726)
#include <stdio.h>
#define CIF 10
long long d[CIF + 1][CIF + 1];
inline void precalc(){
long long i, j;
d[0][0] = 1;
for(i = 1; i <= CIF; i++){
for(j = 0; j <= CIF; j++){
d[i][j] += (CIF - 1) * d[i - 1][j];
if(j != 0)
d[i][j] += d[i - 1][j - 1];
}
}
for(i = 0; i <= CIF; i++)
for(j = CIF - 1; j >= 0; j--)
d[i][j] += d[i][j + 1];
}
inline long long solve(long long x, long long c, long long k){
long long p = 1, n = 0, s = 0, rez = 0;
while(p <= x / 10){
p *= 10;
n++;
}
for(; n >= 0; n--){
if(c < x / p)
rez += x / p * d[n][k - s] + d[n][k - s - 1];
else
rez += (x / p + 1) * d[n][k - s];
if(c == x / p)
s++;
x %= p;
p /= 10;
}
return rez;
}
int main(){
precalc();
FILE *in = fopen("cifre.in", "r");
long long a, b, c, k;
fscanf(in, "%lld%lld%lld%lld", &a, &b, &c, &k);
a--;
long long rez = solve(b, c, k) - solve(a, c, k);
FILE *out = fopen("cifre.out", "w");
fprintf(out, "%.4lf", 1.0 * rez / (b - a));
fclose(out);
return 0;
}