Cod sursa(job #885476)

Utilizator maritimCristian Lambru maritim Data 22 februarie 2013 02:01:00
Problema Cifre Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<stdio.h>
#include<math.h>

FILE *f = fopen("cifre.in","r");
FILE *g = fopen("cifre.out","w");

#define MaxNoua 20
#define lim 100000

int A,B,C,K,Sol;
int Best[MaxNoua];

void citire(void)
{
    fscanf(f,"%d %d %d %d",&A,&B,&C,&K);
}

inline int nrCifre(int A,int K)
{
    int nr = (A%10 == K);
    A /= 10;

    for(;A;A/=10)
        nr += (A%10 == K);

    return nr;
}

inline void preproceseaza(void)
{
    for(int i=0;i<=99999;i++)
        ++ Best[nrCifre(i,C)];

    for(int i=10;i>=0;i--)
        Best[i] += Best[i+1];
}

void brut(void)
{
    Sol = 0;

    for(int i=A;i<=B;i++)
        Sol += (nrCifre(i,C) >= K);
}

void Rezolvare(void)
{
    preproceseaza();

    if(A/lim == B/lim)
    {
        brut();
        return ;
    }

    for(int i=A;i%lim;i++)
        Sol += (nrCifre(i,C) >= K);

    for(int i=B/lim*lim;i<=B;i++)
        Sol += (nrCifre(i,C) >= K);

    for(int i=A/lim+1;i<B/lim;i++)
        Sol += Best[K-nrCifre(i,C)];//,fprintf(g,"%d\n",i);
}

int main()
{
    citire();
    Rezolvare();

    fprintf(g,"%lf\n",(double)Sol/(B-A+1));
    //printf("%d\n",Sol);
    //brut();
    //fprintf(g,"%lf\n",(double)Sol/(B-A+1));
    //printf("%d\n",Sol);
}