Cod sursa(job #2434289)

Utilizator mihai50000Mihai-Cristian Popescu mihai50000 Data 1 iulie 2019 14:19:52
Problema Cifre Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <bits/stdc++.h>

using namespace std;

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

int c, k;

int dp[11][11][2];

int f(int p)
{
    if(p <= 0)
        return 0;

    string v;

    while(p)
    {
        v.push_back(p % 10);
        p /= 10;
    }

    reverse(v.begin(), v.end());

    int n = v.size();
    memset(dp, 0, sizeof(dp));

    for(int i = 1; i < v[0]; i++)
        if(i == c)
            dp[1][1][1] = 1;
        else
            dp[1][0][1] = 1;

    if(v[0] == c)
        dp[1][1][0] = 1;
    else
        dp[1][0][0] = 1;

    int nr = dp[1][1][0] + dp[1][0][0];

    for(int i = 1; i < n; i++)
    {
        for(int j = 1; j < v[i]; j++)
            if(j == c)
                dp[i + 1][1][1] = 1;
            else
                dp[i + 1][0][1] = 1;

        if(v[i] == c)
        {
            nr++;
        }

        dp[i + 1][nr][0] = 1;
    }

    for(int i = 2; i <= n; i++)
    {
        for(int j = 0; j <= 9; j++)
        {
            for(int t = 0; t <= 9; t++)
                if(t == c)
                    dp[i][j + 1][1] += dp[i - 1][j][1];
                else
                    dp[i][j][1] += dp[i - 1][j][1];

            for(int t = 0; t < v[i - 1]; t++)
                if(t == c)
                    dp[i][j + 1][1] += dp[i - 1][j][0];
                else
                    dp[i][j][1] += dp[i - 1][j][0];
        }
    }

    int sum = 0;

    for(int i = k; i <= 10; i++)
        sum += dp[n][i][1] + dp[n][i][0];

    return sum;
}

main()
{
    int a, b;
    in >> a >> b;
    in >> c >> k;

    int fav = f(b) - f(a - 1);
    int all = b - a + 1;

    out << fixed << setprecision(5) << (fav * 1.0 / all);
}