Pagini recente » Cod sursa (job #485931) | Profil TzancaUraganuFacePbLaInfo | Cod sursa (job #476084) | Cod sursa (job #1574848) | Cod sursa (job #1303564)
#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 == 0 || (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]);
if(k > nr)
return 0;
int ret = 0, cnt = 0;
if(C != 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(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;
}
}
else {
if(k == 1)
++ret;
for(int i = 1; i < nr; ++i)
ret += 9 * D[i - 1][k];
for(int i = 1; i <= nr; ++i) {
if(a[i] > 0)
ret += (a[i] - 1) * D[nr - i][k - cnt];
if(a[i] > 0 && cnt < k && i > 1)
ret += D[nr - i][k - cnt - 1];
if(a[i] == C)
++cnt;
if(i == nr && cnt == k)
++ret;
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);
printf("%.4lf\n", (double) a / b);
fclose(stdin);
fclose(stdout);
return 0;
}