Pagini recente » Cod sursa (job #1600147) | Cod sursa (job #2883909) | Cod sursa (job #1360692) | Cod sursa (job #1359579) | Cod sursa (job #2923851)
#include <bits/stdc++.h>
using ll = long long;
const int MAX_N = 10;
const int LT = 0;
const int EQ = 1;
const int GT = 2;
int dp[1 + MAX_N][3][1 + MAX_N];
int query(std::string s, int c, int k) {
memset(dp, 0, sizeof(dp));
int n = s.size();
for (int d = 1; d <= 9; d++) {
int add = (d == c);
if (d < s[0] - '0') {
dp[1][LT][add]++;
} else if (d == (s[0] - '0')) {
dp[1][EQ][add]++;
} else {
dp[1][GT][add]++;
}
}
for (int i = 2; i <= n; i++) {
for (int d = 0; d <= 9; d++) {
int add = (d == c);
for (int fr = add; fr <= i; fr++) {
if (d < s[i - 1] - '0') {
dp[i][LT][fr] += dp[i - 1][LT][fr - add];
dp[i][LT][fr] += dp[i - 1][EQ][fr - add];
dp[i][GT][fr] += dp[i - 1][GT][fr - add];
} else if (d == s[i - 1] - '0') {
dp[i][LT][fr] += dp[i - 1][LT][fr - add];
dp[i][EQ][fr] += dp[i - 1][EQ][fr - add];
dp[i][GT][fr] += dp[i - 1][GT][fr - add];
} else {
dp[i][LT][fr] += dp[i - 1][LT][fr - add];
dp[i][GT][fr] += dp[i - 1][EQ][fr - add];
dp[i][GT][fr] += dp[i - 1][GT][fr - add];
}
}
}
}
int answer = 0;
for (int j = k; j <= n; j++) {
for (int i = 1; i <= n; i++) {
answer += dp[i][LT][j];
answer += dp[i][EQ][j];
if (i < n) {
answer += dp[i][GT][j];
}
}
}
return answer;
}
int main() {
std::ifstream fin("cifre.in");
std::ofstream fout("cifre.out");
int a, b, c, k;
fin >> a >> b >> c >> k;
long double y = b - a + 1;
a--;
std::string A = "";
if (a == 0) {
A += "0";
}
while (a > 0) {
A += char('0' + a % 10);
a /= 10;
}
std::reverse(A.begin(), A.end());
std::string B = "";
while (b > 0) {
B += char('0' + b % 10);
b /= 10;
}
std::reverse(B.begin(), B.end());
int x = query(B, c, k) - query(A, c, k);
fout << x << "\n";
long double answer = (long double)(x / y);
fout << std::setprecision(4) << std::fixed << answer;
return 0;
}