Cod sursa(job #283788)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 19 martie 2009 19:53:33
Problema Cifre Scor 70
Compilator c Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <stdio.h>
int A,B,K,C;
int a[16],x[16],nr[16],p9[16];
int compute(int N){
    int nr_cif=0,i,j,t,aux=N,sol=0;
    while (aux>0) {
          ++nr_cif;
          aux/=10;}
    i=nr_cif;
    aux=N;
    while (aux>0) {
        a[i--]=aux%10;
        aux/=10;
        }
    int put=(1<<nr_cif);
    for (i=0;i<put;++i){
     t=0;
     for (j=0;j<nr_cif;++j)
      if ((1<<j)&i) ++t;
     if (t<K) continue;
     for (j=0;j<nr_cif;++j){
      x[j+1]=-1; 
      if ((1<<j)&i) x[j+1]=C;
      }
     nr[nr_cif+1]=0;
     for (j=nr_cif;j;j--)
      if (x[j]==-1) nr[j]=nr[j+1]+1;
               else nr[j]=nr[j+1];
     for (j=1;j<=nr_cif;++j)
      if (x[j]==-1){
        t=a[j];
        if (t>C) t--;
        sol+=t*p9[nr[j+1]];
        if (a[j]==C) break;
        }
      else if (x[j]<a[j]) {
           sol+=p9[nr[j+1]];
           break;
           }
      else if (x[j]>a[j])
           break;
     if (j>nr_cif) ++sol;
     //printf("%d %d\n",sol,i);
     }
    
    return sol;       
}
int main(){
    int i;
    freopen("cifre.in","r",stdin);
    freopen("cifre.out","w",stdout);
    scanf("%d %d %d %d",&A,&B,&C,&K);
    p9[0]=1;
    for (i=1;i<=10;++i) p9[i]=p9[i-1]*9;
    int r=compute(B)-compute(A-1);
    //printf("%d\n",r);
    printf("%lf",(double)r/(double)(B-A+1));
    return 0;
}