Pagini recente » Cod sursa (job #697701) | Cod sursa (job #1944022) | Cod sursa (job #521957) | Cod sursa (job #787807) | Cod sursa (job #1727592)
#include <fstream>
#include <cstring>
#include <iomanip>
#define LIM 10000
using namespace std;
ifstream f("cifre.in");
ofstream g("cifre.out");
int group[100005] , possible[100];
int a , b , c , k;
int brut(int st , int en) {
int nrt = 0;
for (int i = st; i <= en; ++i) {
int qw = i , nr = 0;
while (qw) {
if (qw % 10 == c) {
++nr;
}
qw /= 10;
}
if (nr >= k) {
++nrt;
}
else {
++possible[nr];
}
}
for (int i = k - 1; i >= 0; --i) {
possible[i] = possible[i] + possible[i + 1];
}
return nrt;
}
int solve(int x) {
if (x <= LIM) {
return brut(1 , x);
}
group[1] = brut(0 , LIM - 1);
int val = 0 , nr = 2;
while (val + LIM - 1 <= x) {
int qw = nr - 1 , nr1 = 0;
while (qw) {
if (qw % 10 == c) {
++nr1;
}
qw /= 10;
}
group[nr] = group[1] + possible[k - nr1];
++nr;
val += LIM;
}
--nr;
group[nr] = brut(val , x);
int ans = 0;
for (int i = 1; i <= nr; ++i) {
ans += group[i];
}
memset(possible , 0 , sizeof(possible));
return ans;
}
int brut0(int st , int en) {
int nrt = 0;
for (int i = st; i <= en; ++i) {
int qw = i , nr = 0 , aux = 0;
while (qw) {
if (qw % 10 == c) {
++nr;
}
qw /= 10;
++aux;
}
nr += 4 - aux;
if (nr >= k) {
++nrt;
}
else {
++possible[nr];
}
}
for (int i = k - 1; i >= 0; --i) {
possible[i] = possible[i] + possible[i + 1];
}
return nrt;
}
int solve0(int x) {
if (x <= LIM) {
return brut(1 , x);
}
group[1] = brut0(0 , LIM - 1);
int val = 0 , nr = 2;
while (val + LIM - 1 <= x) {
int qw = nr - 1 , nr1 = 0;
while (qw) {
if (qw % 10 == c) {
++nr1;
}
qw /= 10;
}
group[nr] = group[1] + possible[k - nr1];
++nr;
val += LIM;
}
--nr;
group[nr] = brut(val , x);
group[1] = brut(0 , LIM - 1);
int ans = 0;
for (int i = 1; i <= nr; ++i) {
ans += group[i];
}
memset(possible , 0 , sizeof(possible));
return ans;
}
int main() {
f >> a >> b >> c >> k;
int aux;
if (c == 0) {
aux = solve0(b) - solve0(a - 1);
}
else {
aux = solve(b) - solve(a - 1);
}
long double a1 = a , b1 = b;
long double sol = aux / (b1 - a1 + 1);
if (b > 1000000)
g << setprecision(4) << sol;
else {
g << setprecision(3) << sol;
}
return 0;
}