Pagini recente » Cod sursa (job #2755248) | Cod sursa (job #1761000) | Cod sursa (job #2478756) | Cod sursa (job #1103278) | Cod sursa (job #52596)
Cod sursa(job #52596)
#include<stdio.h>
int C,K;
int a[15],n,b[15];
int p9[15];
int valid(int x)
{
int i,nr=0;
for(i=0;i<n;i++)
if( (1<<i) & x )
nr++;
if(nr>=K)
return 1;
return 0;
}
int f(int x)
{
int varza=x,i,nr,tot=0,j,k;
n=0;
while(varza)
{
a[++n]=varza%10;
varza/=10;
}
if(n-1 != 0)
for(k=K;k<=n-1;k++)
tot+=(n-1-k)*p9[n-1];
for(i=0;i<(1<<n);i++)
if(valid(i))
{
nr=0;
for(k=0;k<n;k++)
if( (1<<k) & i )
{
b[k+1]=C;
nr++;
}
else
b[k+1]=0;
for(k=1;k<=n;k++)
if(!b[k])
b[k]=a[k];
j=n;
while(j && b[j] != C) j--;
if(j==n && C > a[n]);
else
{
if(j==1 || C<a[j]);
else
{
j++;
while(j<=n && b[j]==0)
{
b[j]=9;
j--;
}
b[j]--;
while(b[n]==0) n--;
}
nr=n-nr;
for(k=n;k;k--)
if( (1<<(k-1)) & i );
else
{
nr--;
if(b[k]>C)
tot+=(b[k])*p9[nr];
else
tot+=(b[k]+1)*p9[nr];
}
}
}
return tot;
}
int main()
{
FILE *fin=fopen("cifre.in","r"),
*fout=fopen("cifre.out","w");
int A,B,nr;
fscanf(fin,"%d%d%d%d",&A,&B,&C,&K);
p9[0]=1;
for(nr=1;nr<=12;nr++)
p9[nr]=p9[nr-1]*9;
if(C)
nr=f(B)-f(A-1);
else
nr=1;
double sol=(double)nr/(double)(B-A+1);
fprintf(fout,"%.4f\n",sol);
fclose(fin);
fclose(fout);
return 0;
}