Cod sursa(job #2710699)

Utilizator Alex_tz307Lorintz Alexandru Alex_tz307 Data 22 februarie 2021 21:38:56
Problema Cifre Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <bits/stdc++.h>

using namespace std;

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

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

int f(int x) {
    if(x < 0)
        return 0;
    vector<int> a;
    while(x) {
        a.emplace_back(x % 10);
        x /= 10;
    }
    reverse(a.begin(), a.end());
    int N = a.size();
    dp[0][0][0][0] = 1;
    for(int i = 0; i < N; ++i)
        for(int j = 0; j < N; ++j)
            for(int lower = 0; lower < 2; ++lower)
                for(int can_zero = 0; can_zero < 2; ++can_zero)
                    for(int c = 0; c < 10; ++c) {
                        if(!lower && c > a[i])
                            continue;
                        int new_j = j;
                        bool new_lower = lower | (c < a[i]),
                             new_can_zero = can_zero | (c != 0);
                        if(c == C && (c > 0 || can_zero))
                            ++new_j;
                        dp[i + 1][new_j][new_lower][new_can_zero] += dp[i][j][lower][can_zero];
                    }
    int ans = 0;
    for(int i = K; i <= N; ++i)
        ans += dp[N][i][0][1] + dp[N][i][1][1];
    if(C == 0 && K < 2)
        ++ans;
    return ans;
}

int main() {
    fin >> A >> B >> C >> K;
    fout << fixed << setprecision(4) << (double)(f(B) - f(A - 1)) / (B - A + 1) << '\n';
}