Pagini recente » Cod sursa (job #45181) | Cod sursa (job #1906387) | Cod sursa (job #2051596) | Cod sursa (job #1870254) | Cod sursa (job #285347)
Cod sursa(job #285347)
#include <stdio.h>
int A,B,K,C;
int a[16],x[16],nr[16],p9[16];
int cnt[16][16],cnt0[16][16];
int cal(int n,int k){
int i,r=0;
for (i=0;i<k;++i)
r+=cnt[n][i];
int p=1;
for (i=1;i<=n;++i) p*=10;
return p-r;
}
int cal0(int n,int k){
int i,r=0;
for (i=0;i<k;++i)
r+=cnt0[n][i];
int p=1;
for (i=1;i<=n;++i) p*=10;
return p-r;
}
int compute(int N){
if (K==0) return N+1;
if (N<0) return 0;
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;
}
if (C==0){
for (i=0;i<=K;++i) cnt[0][i]=cnt[1][i]=0;
cnt[1][0]=9;
cnt[1][1]=1;
for (i=2;i<=nr_cif;++i){
cnt[i][0]=p9[i];
for (j=1;j<=K;++j) cnt[i][j]=cnt[i-1][j]*9+cnt[i-1][j-1];
}
for (i=0;i<=K;++i) cnt0[0][i]=cnt0[1][i]=0;
cnt0[1][0]=9;
cnt0[1][1]=1;
for (i=2;i<=nr_cif;++i){
cnt0[i][0]=((p9[i+1]-1)/8);
for (j=1;j<=K;++j) cnt0[i][j]=cnt0[i-1][j]+cnt[i-1][j]*9;
}
sol=(a[1]-1)*cal(nr_cif-1,K)
+cal0(nr_cif-1,K);
t=0;
for (i=2;i<nr_cif;++i){
j=nr_cif+1-i;
aux=K-t;
if (aux<0) aux=0;
if (a[i]>0)
sol+=cal(j-1,aux)*(a[i]-1);
aux--;
if (aux<0) aux=0;
if (a[i]>0)
sol+=cal(j-1,aux);
if (a[i]==0) t++;
}
aux=K-t;
if (aux<0) aux=0;
if (aux==1) ++sol;
else if (aux==0)
sol+=a[nr_cif]+1;
return sol+1;
}
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]];
if (a[j]==C) break;
}
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<=11;++i) p9[i]=p9[i-1]*9;
int r=compute(B)-compute(A-1);
//printf("%d\n",r);
printf("%lf",(double)r/(double)(B-A+1));
return 0;
}