Pagini recente » Cod sursa (job #1009322) | Cod sursa (job #3232666) | Cod sursa (job #745567) | Cod sursa (job #399445) | Cod sursa (job #2198223)
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define pb push_back
#define mp make_pair
#define pii pair<int, int>
#define pll pair<ll, ll>
#define pdd pair<ld, ld>
#define all(x) (x).begin(), (x).end()
#define fi first
#define se second
int a, b, c, k;
int dp[15][15][3];
int v[15];
int Solve(int x) {
if (x < 0) {
return 0;
}
if (x == 0) {
return (c == 0 && k <= 1);
}
// dp[i][j][0/1/2] = length i, j digits == c, 0/1/2 - less/equal/bigger than x
//
memset(v, 0, sizeof(v));
memset(dp, 0, sizeof(dp));
int n = 0;
do {
v[++n] = x % 10;
x /= 10;
} while (x);
reverse(v + 1, v + n + 1);
for (int i = 1; i < v[1]; i++) {
dp[1][(i == c)][0]++;
}
dp[1][(v[1] == c)][1] = 1;
for (int i = v[1] + 1; i < 10; i++) {
dp[1][(i == c)][2]++;
}
for (int i = 1; i < n; i++) {
for (int j = 0; j <= n; j++) {
for (int k = 0; k < 10; k++) {
if (k < v[i + 1]) {
dp[i + 1][j + (k == c)][0] += dp[i][j][0] + dp[i][j][1];
dp[i + 1][j + (k == c)][2] += dp[i][j][2];
} else if (k == v[i + 1]) {
dp[i + 1][j + (k == c)][0] += dp[i][j][0];
dp[i + 1][j + (k == c)][1] += dp[i][j][1];
dp[i + 1][j + (k == c)][2] += dp[i][j][2];
} else {
dp[i + 1][j + (k == c)][0] += dp[i][j][0];
dp[i + 1][j + (k == c)][2] += dp[i][j][1] + dp[i][j][2];
}
}
}
}
int ans = 0;
for (int i = 1; i <= n; i++) {
for (int j = k; j <= n; j++) {
ans += dp[i][j][0] + dp[i][j][1];
if (i != n) {
ans += dp[i][j][2];
}
}
}
return ans;
}
int main() {
cin.sync_with_stdio(false);
ifstream cin("cifre.in");
ofstream cout("cifre.out");
cin >> a >> b >> c >> k;
cout << fixed << setprecision(6)
<< 1.0 * (Solve(b) - Solve(a - 1)) / (b - a + 1);
return 0;
}