Cod sursa(job #52596)

Utilizator moga_florianFlorian MOGA moga_florian Data 19 aprilie 2007 13:05:02
Problema Cifre Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#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;    
}