Cod sursa(job #3356511)

Utilizator EricDimiCismaru Eric-Dimitrie EricDimi Data 2 iunie 2026 08:30:56
Problema Cifre Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <fstream>
#include <algorithm>
#include <iomanip>
#include <vector>

using namespace std;

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

const int DMAX = 10;

int dp[2][2][DMAX][DMAX];
int A, B, C, K;

void Reset()
{
    for(bool equal : {false, true})
        for(bool empty : {false, true})
            for(int idx = 0; idx < DMAX; idx++)
                for(int cnt = 0; cnt < DMAX; cnt++)
                    dp[equal][empty][idx][cnt] = -1;
}

vector<int> GetDigits(int val)
{
    vector<int> dig;
    do
    {
        dig.push_back(val % 10);
        val /= 10;
    }
    while(val != 0);
    reverse(dig.begin(), dig.end());
    return dig;
}

int ComputeState(bool equal, bool empty, int idx, int cnt,
                 const vector<int>& digits, const int& C)
{
    if(idx == (int)digits.size())
        return (cnt >= K);
    if(dp[equal][empty][idx][cnt] != -1)
        return dp[equal][empty][idx][cnt];
    int res = 0;
    for(int dig = 0; dig < 10; dig++)
    {
        if(equal && dig > digits[idx])
            break;
        res += ComputeState(equal && (dig == digits[idx]),
                            empty && (dig == 0),
                            idx + 1,
                            cnt + (dig == C) * ((C == 0) ? !(empty & (dig == 0)) : 1),
                            digits, C);
    }
    return dp[equal][empty][idx][cnt] = res;
}

int CountNums(int val)
{
    Reset();
    if(val < 0)
        return 0;
    vector<int> digits = GetDigits(val);
    return ComputeState(true, true, 0, 0, digits, C);
}

int main()
{
    f >> A >> B >> C >> K;
    double prob = (double)(CountNums(B) - CountNums(A - 1)) / (double)(B - A + 1);
    g << fixed << setprecision(4) << prob << '\n';
    
    f.close();
    g.close();
    return 0;
}