Cod sursa(job #204037)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 21 august 2008 14:49:52
Problema Cifre Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#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;
}