Cod sursa(job #22815)

Utilizator t30Rosu Teodor t30 Data 27 februarie 2007 16:20:51
Problema Cifre Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include<stdio.h>
long aa,bb,A,v[12][12],vv[12][12];
int a[12],b[12],nr,na=0,nb=0,c,n;
void READ()
{
	FILE *f;
	f=fopen("cifre.in","r");
	fscanf(f,"%ld %ld %d %d",&aa,&bb,&c,&nr);
	A=bb-aa+1;
    while(aa) { na++; a[na]=aa%10; aa/=10; }
	bb++;
	while(bb) { nb++; b[nb]=bb%10; bb/=10; }
	fclose(f);
}

void BUILD()
{       int i,j;
	v[0][0]=1;
	v[1][1]=1;
	v[1][0]=9;
	for(i=2;i<=nb;i++)
		for(j=0;j<=i;j++)
		   v[i][j]=9*v[i-1][j]+(j==0?0:v[i-1][j-1]);
	if(c==0) vv[1][0]=9;
	else vv[1][0]=8,vv[1][1]=1;

	for(i=2;i<=nb;i++)
		for(j=0;j<=i;j++)
		   if(c==0) vv[i][j]=vv[i-1][j]+9*v[i-1][j];
		   else vv[i][j]=vv[i-1][j]+8*v[i-1][j]+v[i-1][j-1];
}

long solve(int *x)
{  int i,j,k;
   long sol=0;

   for(i=nr;i<=n;i++)
      sol+=vv[n-1][i];

   for(i=1;i<x[n];i++)
     for(j=nr;j<=n;j++)
      if(i==c){ if(j>0) sol+=v[n-1][j-1]; }
      else sol+=v[n-1][j];

   if(x[n]==c && nr>0) nr--;
   for(i=n-1;i>=1;i--){
	for(j=0;j<x[i];j++)
	   for(k=nr;k<=n;k++)
	      if(j==c){ if(k>0) sol+=v[i-1][k-1];}
	      else sol+=v[i-1][k];
	if(x[i]==c && nr>0) nr--;
   }

return sol;
}

int main()
{
    FILE *g;
    g=fopen("cifre.out","w");
     
	READ();
	BUILD();
	long sol;
	n=nb; aa=nr;
	sol=solve(b);

	n=na; nr=aa;
	sol-=solve(a);
	if(a==0 && c==0) sol+=1;

    
	fprintf(g,"%.4f",(float)sol/A);
	fclose(g);
return 0;
}