Cod sursa(job #52755)

Utilizator moga_florianFlorian MOGA moga_florian Data 19 aprilie 2007 20:59:28
Problema Cifre Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 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)
{
if(!x)
  return 0;
    
int varza,i,nr,tot=0,j,k;
varza=x;
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];
 tot++;
 }

 
for(i=0;i<((1<<n)-1);i++)
  if(valid(i))
   {
   varza=x;
   n=0;
   while(varza)
    {
    a[++n]=varza%10;
    varza/=10;
    }
              
   nr=0;
   for(k=0;k<n;k++)
     if( ((1<<k) & i) )
       {
       b[k+1]=C;
       nr++;
       }
     else
       b[k+1]=a[k+1];
       
   j=n-1;
   while(j>=0 && ((1<<(j))&i)==0 ) j--;
   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(k==n)
         {
         if(b[k]>=C)
            tot+=(b[k]-1)*p9[nr];
         else
            tot+=b[k]*p9[nr];
         }         
         else
         {
         if(b[k]>C)
           tot+=(b[k])*p9[nr];
         else
           tot+=(b[k]+1)*p9[nr];            
         }
         }                
   }  
   
varza=x;
n=0;
while(varza)
 {
 a[++n]=varza%10;
 varza/=10;
 }

for(i=1;i<=n;i++)
  b[i]=C;
i=n;
while(i && a[i]==b[i]) i--;
if(!i || a[i]>b[i]) 
    tot++;
       
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;    
}