Cod sursa(job #285337)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 22 martie 2009 15:22:52
Problema Cifre Scor 90
Compilator c Status done
Runda Arhiva de probleme Marime 2.64 kb
#include <stdio.h>
int A,B,K,C;
int a[16],x[16],nr[16],p9[16];
int cnt[16][16],cnt0[16][16];
int cal(int n,int k){
    int i,r=0;
    for (i=0;i<k;++i)
      r+=cnt[n][i];
    int p=1;
    for (i=1;i<=n;++i) p*=10;
    return p-r;
    }
int cal0(int n,int k){
    int i,r=0;
    for (i=0;i<k;++i)
      r+=cnt0[n][i];
    int p=1;
    for (i=1;i<=n;++i) p*=10;
    return p-r;
    }
int compute(int N){
    if (K==0) return N+1;
    if (N<0) return 0;
    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;
        }
    if (C==0){
      for (i=0;i<=K;++i) cnt[0][i]=cnt[1][i]=0;
      cnt[1][0]=9;
      cnt[1][1]=1;
      for (i=2;i<=nr_cif;++i){
        cnt[i][0]=p9[i];
        for (j=1;j<=K;++j) cnt[i][j]=cnt[i-1][j]*9+cnt[i-1][j-1];
        }
      for (i=0;i<=K;++i) cnt0[0][i]=cnt0[1][i]=0;
      cnt0[1][0]=9;
      cnt0[1][1]=1;
      for (i=2;i<=nr_cif;++i){
        cnt0[i][0]=((p9[i+1]-1)/8);
        for (j=1;j<=K;++j) cnt0[i][j]=cnt0[i-1][j]+cnt[i-1][j]*9;
        }
      sol=(a[1]-1)*cal(nr_cif-1,K)
          +cal0(nr_cif-1,K);
      t=0;
      for (i=2;i<nr_cif;++i){
         j=nr_cif+1-i;
         aux=K-t;
         if (aux<0) aux=0;
         if (a[i]>0)
          sol+=cal(j-1,aux)*(a[i]-1);
         aux--;
         if (aux<0) aux=0;
          sol+=cal(j-1,aux);
         if (a[i]==0) t++;
         }
      aux=K-t;
      if (aux<0) aux=0;
      if (aux==1) ++sol;
         else if (aux==0)
           sol+=a[nr_cif]+1;
      return sol+1;
      }
    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;
     }
    
    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<=11;++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;
}