Cod sursa(job #1170938)

Utilizator hevelebalazshevele balazs hevelebalazs Data 14 aprilie 2014 21:33:01
Problema Cifre Scor 70
Compilator c Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <stdio.h>
#include <stdlib.h>
#define fr(i,a,b) for(i=a;i<b;++i)
#define rf(i,a,b) for(i=b-1;i>=a;--i)
int C[10][10];
int nine[10];
char cool(int x,int c,int k){
    int s=0;
    while(x){s+=x%10==c;x/=10;}
    return s>=k;
    }
int get(int a,int c,int k){
    int b[10]={1};
    int i,d=0;
    while(a){
        int A=a%10;
        ++d;
        if(A==c){
            rf(i,1,10)b[i]=b[i-1];
            b[0]=0;
            }
        else if(A>c){
            fr(i,0,d)b[i+1]+=C[d-1][i]*nine[d-i-1];
            --A;
            }
        fr(i,0,d)b[i]+=A*C[d-1][i]*nine[d-i-1];
        a/=10;
        }
    d=0;
    fr(i,k,10)d+=b[i];
    return d;
    }
int main(){
    freopen("cifre.in","r",stdin);
    freopen("cifre.out","w",stdout);
    int j,i,a,b,c,k;
    fr(i,0,10)fr(j,0,i+1)C[i][j]=j?C[i-1][j]+C[i-1][j-1]:1;
    nine[0]=1;
    fr(i,1,10)nine[i]=nine[i-1]*9;
    scanf("%i%i%i%i",&a,&b,&c,&k);
    int s1=get(b,c,k)-get(a-1,c,k),s2=b-a+1;
    printf("%.4f\n",(float)s1/s2);
    return 0;
    }