Pagini recente » Cod sursa (job #1683058) | Istoria paginii runda/dist2 | Cod sursa (job #1895891) | Cod sursa (job #897589) | Cod sursa (job #283755)
Cod sursa(job #283755)
#include <stdio.h>
int A,B,K,C;
int a[16],x[16],nr[16],p9[16];
int compute(int N){
int nr_cif=0,i,j,t,aux=N,sol=0;
while (aux>0) {
++nr_cif;
aux/=10;}
i=nr_cif;
aux=N;
while (aux>0) {
a[i--]=aux%10;
aux/=10;
}
int put=(1<<nr_cif);
for (i=0;i<put;++i){
t=0;
for (j=0;j<nr_cif;++j)
if ((1<<j)&i) ++t;
if (t<K) continue;
for (j=0;j<nr_cif;++j){
x[j+1]=-1;
if ((1<<j)&i) x[j+1]=C;
}
nr[nr_cif+1]=0;
for (j=nr_cif;j;j--)
if (x[j]==-1) nr[j]=nr[j+1]+1;
else nr[j]=nr[j+1];
for (j=1;j<=nr_cif;++j)
if (x[j]==-1){
t=a[j];
if (t>=C) t--;
sol+=t*p9[nr[j+1]];
}
else if (x[j]<a[j]) {
sol+=p9[nr[j+1]];
break;
}
else if (x[j]>a[j])
break;
if (j>nr_cif) ++sol;
}
return sol;
}
int main(){
int i;
freopen("cifre.in","r",stdin);
freopen("cifre.out","w",stdout);
scanf("%d %d %d %d",&A,&B,&C,&K);
p9[0]=1;
for (i=1;i<=10;++i) p9[i]=p9[i-1]*9;
int r=compute(B)-compute(A-1);
printf("%lf",(double)r/(double)(B-A+1));
return 0;
}