Cod sursa(job #1727583)

Utilizator cristina_borzaCristina Borza cristina_borza Data 11 iulie 2016 10:50:08
Problema Cifre Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <fstream>
#include <cstring>
#include <iomanip>

#define LIM 10000

using namespace std;

ifstream f("cifre.in");
ofstream g("cifre.out");

int group[100005] , possible[100];
int a , b , c , k;

int brut(int st , int en) {
    int nrt = 0;
    for (int i = st; i <= en; ++i) {
        int qw = i , nr = 0;
        while (qw) {
            if (qw % 10 == c) {
                ++nr;
            }

            qw /= 10;
        }

        if (nr >= k) {
            ++nrt;
        }

        else {
            ++possible[nr];
        }
    }

    for (int i = k - 1; i >= 0; --i) {
        possible[i] = possible[i] + possible[i + 1];
    }
    return nrt;
}

int solve(int x) {
    if (x <= LIM) {
        return brut(1 , x);
    }

    group[1] = brut(1 , LIM - 1);

    int val = 0 , nr = 2;
    while (val + LIM - 1 <= x) {
        int qw = nr - 1 , nr1 = 0;
        while (qw) {
            if (qw % 10 == c) {
                ++nr1;
            }

            qw /= 10;
        }

        group[nr] = group[1] + possible[k - nr1];
        ++nr;
        val += LIM;
    }

    --nr;
    group[nr] = brut(val , x);

    int ans = 0;
    for (int i = 1; i <= nr; ++i) {
        ans += group[i];
    }

    memset(possible , 0 , sizeof(possible));

    return ans;
}

int main() {
    f >> a >> b >> c >> k;

    int aux = solve(b) - solve(a - 1);
    long double a1 = a , b1 = b;
    long double sol = aux / (b1 - a1 + 1);

    g << setprecision(3) << sol;
    return 0;
}