Pagini recente » Cod sursa (job #956557) | Cod sursa (job #1670191) | Cod sursa (job #2386769) | Cod sursa (job #1030317) | Cod sursa (job #1696324)
#include<fstream>
#include<iomanip>
#include<cstring>
using namespace std;
int a, b, c, k, i, j, nr, x, nrc;
int d[10][10], f[10], s[10][10], v[10], w[10], s1[10][10], d1[10][10];
double sol;
ifstream fin("cifre.in");
ofstream fout("cifre.out");
int fr(int x){
int sol = 0, nr = 0;
int aux = x;
while(aux != 0){
v[++nr] = aux % 10;
aux /= 10;
}
sol += s[nr - 1][k];
memset(w, 0, sizeof(w));
w[nr] = 1;
int j = nr;
while(j > 1){
while(w[j] == v[j] && j > 0){
j--;
}
if(j <= 1){
break;
}
int nrc = 0;
for(int i = j; i <= nr; i++){
if(w[i] == c){
nrc++;
}
}
if(c == 0){
sol += s1[j - 1][max(0, k - nrc)];
}
sol += s[j - 1][max(0, k - nrc)];
w[j]++;
}
while(w[1] <= v[1]){
int nrc = 0;
for(int i = 1; i <= nr; i++){
if(w[i] == c){
nrc++;
}
}
if(nrc >= k){
sol++;
}
w[1]++;
}
return sol;
}
int main(){
fin>> a >> b >> c >> k;
for(i = 1; i <= 9; i++){
memset(f, 0, sizeof(f));
if(c != 0){
while(f[0] == 0){
nrc = 0;
nr = 1;
for(j = 1; j <= i; j++){
if(f[j] == 1){
nrc++;
}
}
for(j = 2; j <= i; j++){
if(f[j] == 0){
nr *= 9;
}
}
if(f[1] == 0){
nr *= 9;
}
d[i][nrc] += nr;
j = i;
while(f[j] == 1){
f[j] = 0;
j--;
}
f[j] = 1;
}
}
else{
while(f[1] == 0){
nrc = 0;
nr = 1;
for(j = 1; j <= i; j++){
if(f[j] == 1){
nrc++;
}
}
for(j = 2; j <= i; j++){
if(f[j] == 0){
nr *= 9;
}
}
d1[i][nrc + 1] += nr;
if(f[1] == 0){
nr *= 9;
}
d[i][nrc] += nr;
d1[i][nrc] += nr;
j = i;
while(f[j] == 1){
f[j] = 0;
j--;
}
f[j] = 1;
}
}
}
for(i = 1; i <= 9; i++){
for(j = i; j >= 0; j--){
s[i][j] = d[i][j] + s[i][j + 1];
s1[i][j] = d1[i][j] + s1[i][j + 1];
}
}
x = fr(b) - fr(a - 1);
sol = x * 1.0 / (b - a + 1);
fout<< setprecision(4) << fixed << sol <<"\n";
return 0;
}