Cod sursa(job #1730674)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 17 iulie 2016 13:53:03
Problema Cifre Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <cstdio>
#define MAXCIF 10
int c,k;
int cif[MAXCIF+1],fact[MAXCIF+1],p9[MAXCIF+1];
inline int comb(int n,int k){
    return fact[n]/(fact[k]*fact[n-k]);
}
inline int cauta(int x){
   int i,nrcif,rez,f,p,j,con,z,i1;
   if(x==-1)
      return 0;
   if(x==0){
      if(c==0&&k==1)
         return 1;
      else
         return 0;
   }
   nrcif=0;
   con=0;
   while(x>0){
       cif[nrcif++]=x%10;
       if(x%10==c)
         con++;
       x/=10;
   }
   rez=0;
   if(con>=k)
      rez++;
   i=nrcif-1;
   x=0;
   while(i>=0){
       for(p=cif[i]-1;p>=0;p--)
           if(!(p==0&&i==nrcif-1)){
               if(p==c)
                 f=1;
               else
                 f=0;
               j=k-x-f;
               if(j<0)
                 j=0;
               while(j<=i){
                  rez+=comb(i,j)*p9[i-j];
                  j++;
               }
           }
           else{
              for(i1=i-1;i1>=0;i1--)
               for(z=1;z<MAXCIF;z++){
                  if(z==c)
                    f=1;
                  else
                    f=0;
                  j=k-x-f;
                  if(j<0)
                    j=0;
                  while(j<=i1){
                    rez+=comb(i1,j)*p9[i1-j];
                    j++;
                  }
               }
           }
       if(cif[i]==c)
          x++;
       i--;
   }
   if(c==0&&k==1)
      rez++;
   return rez;
}
int main(){
   FILE*fi,*fout;
   int a,b,i;
   double rez1,rez2;
   fi=fopen("cifre.in" ,"r");
   fout=fopen("cifre.out" ,"w");
   fscanf(fi,"%d%d%d%d" ,&a,&b,&c,&k);
   fact[0]=1;
   p9[0]=1;
   for(i=1;i<=MAXCIF;i++){
      fact[i]=fact[i-1]*i;
      p9[i]=p9[i-1]*9;
   }
   if(k==0)
      fprintf(fout,"1.0000");
   else{
      rez1=cauta(b)-cauta(a-1);
      rez2=b-a+1;
      fprintf(fout,"%.4lf" ,rez1/rez2);
   }
   fclose(fi);
   fclose(fout);
   return 0;
}