Cod sursa(job #2717166)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 6 martie 2021 15:43:49
Problema Cifre Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("cifre.in");
ofstream fout("cifre.out");

int a, b, c, k, dp[10][10], v[15];
int nrCnt(int val)
{
    int ax = val, nrCC = 0, ras = 0;
    while(ax)
    {
        nrCC++;
        ras = ras * 10 + ax % 10;
        ax /= 10;
    }
    int rez = 0, z = 0, n = ras;
    if(c == 0){
        for(int i = nrCC - 1; i >= 1; --i)
            rez += 9 * dp[i - 1][k];
        z = 1;
    }
    for(int i = nrCC; i >= 1; --i){
        if(n % 10 > c && k > 0 && z == 0)
            rez += dp[i - 1][k - 1], --n;
        rez += (n % 10 - z) * dp[i - 1][k];
        if(n % 10 == c)
            k = (k > 0 ? k - 1 : 0);
        n /= 10;
        z = 0;
    }

    if(k == 0)
        ++rez;
    return rez;
}

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

    dp[0][0] = 1;
    for(int nrCif = 1; nrCif <= 9; ++nrCif)
    {
        dp[nrCif][0] = dp[nrCif - 1][0] * 9;
        for(int cer = 1; cer <= 9; ++cer)
            dp[nrCif][cer] = dp[nrCif - 1][cer] * 9 + dp[nrCif - 1][cer - 1];
    }

    for(int nrCif = 1; nrCif <= 9; ++nrCif)
        for(int cer = 8; cer >= 0; -- cer)
            dp[nrCif][cer] += dp[nrCif][cer + 1];

    int axk = k;
    int nr = nrCnt(b);
    k = axk;
    nr -= nrCnt(a - 1);

    fout << fixed << setprecision(4) << nr / (double)(b - a + 1) << '\n';
    return 0;
}