Pagini recente » Cod sursa (job #385220) | Istoria paginii utilizator/tvlad | Solutii Summer Challenge, Runda 1 | Istoria paginii monthly-2012/runda-8/solutii | Cod sursa (job #204037)
Cod sursa(job #204037)
#include <stdio.h>
#include <string.h>
#define FIN "cifre.in"
#define FOUT "cifre.out"
#define N_MIN 11
long A,B;
int C,K;
int v1[9];
int v[N_MIN],pd[N_MIN][N_MIN];
int n(int cif)
{
int i,j,k,nr_cif,cif1,nr;
if (cif==-1) return 0;
if (cif==0)
{
if (K==0 && C<=1) return 1;
else return 0;
}
nr_cif=0;
cif1=cif;
while (cif1)
{
v[nr_cif++]=cif1%10;
cif1/=10;
}
memset(pd,0,sizeof(pd));
if (v[nr_cif-1]==K) pd[nr_cif-1][1]=1;
else pd[nr_cif-1][0]=1;
for (i=nr_cif-2;i>=0;--i)
{
for (k=0;k<=v[i];++k)
if (k!=K)
pd[i][0]+=pd[i+1][0];
for (j=1;j<=nr_cif;++j)
for (k=0;k<=v[i];++k)
if (k==K)
pd[i][j]+=pd[i+1][j-1];
else
pd[i][j]+=pd[i+1][j];
}
nr=0;
for (i=C;i<=nr_cif;++i)
nr+=pd[0][i];
v[nr_cif-1]--;
for (i=0;i<nr_cif-1;++i)
v[i]=9;
cif1=0;
for (i=nr_cif-1;i>=0;--i)
cif1=cif1*10+v[i];
nr+=n(cif1);
return nr;
}
int main()
{
int i,nr=0,r,x;
freopen(FIN,"rt",stdin);
scanf("%ld %ld %d %d", &A, &B, &K, &C);
freopen(FOUT,"wt",stdout);
if (B-A<=1000000)
{
for (i=A;i<=B;++i)
{
x=i;
memset(v1,0,sizeof(v1));
while (x)
{
r=x%10;
v1[r]++;
x/=10;
}
if (v1[C]>=K) nr++;
}
printf("%.4lf",(double)nr/(double)(B-A+1));
}
else printf("%.4lf",(double)(n(B)-n(A-1))/(double)(B-A+1));
return 0;
}