Cod sursa(job #2715245)

Utilizator PatrickCplusplusPatrick Kristian Ondreovici PatrickCplusplus Data 3 martie 2021 12:50:35
Problema Cifre Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.13 kb
#include <bits/stdc++.h>

using namespace std;

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

int a, b, c, k, nrCifre, dp[20][20], dp2[20][20][2];
vector <int> v;

int dinamica(int index, int contor){
    if (dp[index][contor] > 0){
        return dp[index][contor];
    }
    if (index == nrCifre + 1){
        return contor >= k;
    }
    if (index == 1){
        if (c == 0){
            return dp[index][contor] = 9 * dinamica(index + 1, contor);
        }
        else{
            return dp[index][contor] = dinamica(index + 1, contor + 1) + 8 * dinamica(index + 1, contor);
        }
    }
    else{
        return dp[index][contor] = dinamica(index + 1, contor + 1) + 9 * dinamica(index + 1, contor);
    }
}

int dinamica2(int index, int contor, int pot){
    if (dp2[index][contor][pot] > 0){
        return dp2[index][contor][pot];
    }
    if (index == nrCifre + 1){
        return contor >= k;
    }
    if (pot == 0){
        if (index == 1){
            if (c > v[index - 1] || c == 0){
                return dp2[index][contor][pot] = (v[index - 1] - 1) * dinamica2(index + 1, contor, 1) + dinamica2(index + 1, contor, 0);
            }
            else{
                if (c == v[index - 1]){
                    return dp2[index][contor][pot] = dinamica2(index + 1, contor + 1, 0) + (v[index - 1] - 1) * dinamica2(index + 1, contor, 1);
                }
                else{
                    return dp2[index][contor][pot] = dinamica2(index + 1, contor + 1, 1) + dinamica2(index + 1, contor, 0) + (v[index - 1] - 2) * dinamica2(index + 1, contor, 1);
                }
            }
        }
        else{
            if (c > v[index - 1]){
                return dp2[index][contor][pot] = v[index - 1] * dinamica2(index + 1, contor, 1) + dinamica2(index + 1, contor, 0);
            }
            else{
                if (c == v[index - 1]){
                    return dp2[index][contor][pot] = dinamica2(index + 1, contor + 1, 0) + v[index - 1] * dinamica2(index + 1, contor, 1);
                }
                else{
                    return dp2[index][contor][pot] = dinamica2(index + 1, contor + 1, 1) + dinamica2(index + 1, contor, 0) + (v[index - 1] - 1) * dinamica2(index + 1, contor, 1);
                }
            }
        }
    }
    else{
        return dp[index][contor] = dinamica2(index + 1, contor + 1, 1) + 9 * dinamica2(index + 1, contor, 1);
    }
}

int solve(int a){
    if (a < 10){
        if (c <= a){
            return 1;
        }
        return 0;
    }
    v.clear();
    while (a > 0){
        v.push_back(a % 10);
        a = a / 10;
    }
    reverse(v.begin(), v.end());
    int ans = 0;
    for (int i = 1; i < v.size(); ++i){
        nrCifre = i;
        memset(dp, 0, sizeof dp);
        ans += dinamica(1, 0);
    }
    nrCifre = v.size();
    memset(dp2, 0, sizeof dp2);
    ans += dinamica2(1, 0, 0);
    return ans;
}

int main(){
    fin >> a >> b >> c >> k;
    int diff = solve(b) - solve(a - 1);
    fout << fixed << setprecision(4) << diff / (double)(b - a + 1);
    fin.close();
    fout.close();
    return 0;
}