Cod sursa(job #952699)

Utilizator primulDarie Sergiu primul Data 23 mai 2013 20:18:04
Problema Cifre Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <stdio.h>
#include <algorithm>
#define limit 100000
 
using namespace std;
 
int a, b, c, k;
int apar[limit + 4], ap0[limit + 4];
int me[16], me0[16];
 
int nrcf(int x)
{
    int f_rez = 0;
    if (!x)
        return 1;
    for (; x; x /= 10, f_rez++);
    return f_rez;
}
 
int calc(int x)
{
    int f_rez = 0, av;
    for (int i = 0; i < x / limit; i++)
    {
        av = max(0, k - apar[i]);
        if (c == 0 && i == 0)
            f_rez += me[k];
        else if (c == 0)
            f_rez += me0[av];
        else f_rez += me[av];
    }
    av = max(0, apar[x / limit]);
    if (c == 0 && x / limit == 0)
        av = 0;
    for (int i = 0; i <= x % limit; i++)
        if (c || !i)
        {
            if (av + apar[i] >= k)
                f_rez++;
        }
        else if (av + ap0[i] >= k)
            f_rez++;
    return f_rez;
}
 
int main()
{
    freopen("cifre.in","r",stdin);
    freopen("cifre.out","w",stdout);
    scanf("%ld %ld %ld %ld", &a, &b, &c, &k);
    for (int i = 0; i < limit; me[apar[i]]++, me0[ap0[i]]++, i++)
    {
        if (i > 9)
            apar[i] = apar[i / 10] + (i % 10 == c);
        else apar[i] = (i % 10 == c);
        ap0[i] = 5 - nrcf(i) + apar[i];
    }
    for (int i = 5; i; me[i - 1] += me[i], me0[i - 1] += me0[i], i--);
    printf("%.7lf\n", (double) (calc(b) - calc(a - 1)) / (b - a + 1));
    fclose(stdin);
    fclose(stdout);
    return 0;
}