Pagini recente » Cod sursa (job #1563205) | Cod sursa (job #1297185) | Cod sursa (job #1726844) | Cod sursa (job #2404142) | Cod sursa (job #1730674)
#include <cstdio>
#define MAXCIF 10
int c,k;
int cif[MAXCIF+1],fact[MAXCIF+1],p9[MAXCIF+1];
inline int comb(int n,int k){
return fact[n]/(fact[k]*fact[n-k]);
}
inline int cauta(int x){
int i,nrcif,rez,f,p,j,con,z,i1;
if(x==-1)
return 0;
if(x==0){
if(c==0&&k==1)
return 1;
else
return 0;
}
nrcif=0;
con=0;
while(x>0){
cif[nrcif++]=x%10;
if(x%10==c)
con++;
x/=10;
}
rez=0;
if(con>=k)
rez++;
i=nrcif-1;
x=0;
while(i>=0){
for(p=cif[i]-1;p>=0;p--)
if(!(p==0&&i==nrcif-1)){
if(p==c)
f=1;
else
f=0;
j=k-x-f;
if(j<0)
j=0;
while(j<=i){
rez+=comb(i,j)*p9[i-j];
j++;
}
}
else{
for(i1=i-1;i1>=0;i1--)
for(z=1;z<MAXCIF;z++){
if(z==c)
f=1;
else
f=0;
j=k-x-f;
if(j<0)
j=0;
while(j<=i1){
rez+=comb(i1,j)*p9[i1-j];
j++;
}
}
}
if(cif[i]==c)
x++;
i--;
}
if(c==0&&k==1)
rez++;
return rez;
}
int main(){
FILE*fi,*fout;
int a,b,i;
double rez1,rez2;
fi=fopen("cifre.in" ,"r");
fout=fopen("cifre.out" ,"w");
fscanf(fi,"%d%d%d%d" ,&a,&b,&c,&k);
fact[0]=1;
p9[0]=1;
for(i=1;i<=MAXCIF;i++){
fact[i]=fact[i-1]*i;
p9[i]=p9[i-1]*9;
}
if(k==0)
fprintf(fout,"1.0000");
else{
rez1=cauta(b)-cauta(a-1);
rez2=b-a+1;
fprintf(fout,"%.4lf" ,rez1/rez2);
}
fclose(fi);
fclose(fout);
return 0;
}