Pagini recente » Cod sursa (job #164431) | Cod sursa (job #1216673) | Cod sursa (job #2784175) | Cod sursa (job #1837560) | Cod sursa (job #1696267)
#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][2], v[10], w[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][0];
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;
}
if(w[j] == c){
sol += s[j - 1][1];
}
else{
sol += s[j - 1][0];
}
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 *= 8;
}
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;
}
}
if(f[1] == 0){
nr *= 9;
}
d[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 >= k; j--){
s[i][0] += d[i][j];
s[i][1] += d[i][j];
}
s[i][1] += d[i][k - 1];
}
x = fr(b) - fr(a - 1);
sol = x * 1.0 / (b - a + 1);
fout<< setprecision(4) << fixed << sol <<"\n";
return 0;
}