Pagini recente » Cod sursa (job #2880164) | Cod sursa (job #2860549) | Cod sursa (job #1738785) | Cod sursa (job #1852446) | Cod sursa (job #885476)
Cod sursa(job #885476)
#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);
}