Cod sursa(job #1295517)

Utilizator RaduVisanRadu Visan RaduVisan Data 19 decembrie 2014 18:26:34
Problema Cifre Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int A, B, C, Dp[10][10][2][2], V[10], K, Cnt;

int Solve(int X)
{
    memset(Dp, 0, sizeof(Dp));

    Cnt = 0;
    while(X) V[Cnt ++] = X % 10, X /= 10;
    reverse(V, V + Cnt);

    Dp[0][0][1][0] = 1;
    for(int i = 0; i < Cnt; ++ i)
        for(int j = 0; j < Cnt; ++ j)
            for(int k = 0; k < 2; ++ k)
                for(int l = 0; l < 2; ++ l)
                    for(int nextd = 0; nextd <= 9; ++ nextd)
                    {
                        if(k == 1 && nextd > V[i]) continue;

                        int nexti, nextj, nextk, nextl;

                        nexti = i + 1;

                        if(nextd == C && (C != 0 || l == 1)) nextj = j + 1;
                        else nextj = j;

                        if(k == 1 && nextd == V[i]) nextk = 1;
                        else nextk = 0;

                        if(l == 0 && nextd == 0) nextl = 0;
                        else nextl = 1;

                        Dp[nexti][nextj][nextk][nextl] += Dp[i][j][k][l];
                    }

    int Ans = 0;
    for(int i = K; i <= Cnt; ++ i)
        Ans += Dp[Cnt][i][0][1] + Dp[Cnt][i][1][1];
    if(C == 0) Ans ++;

    return Ans;
}

int main()
{
    freopen("cifre.in", "r", stdin);
    freopen("cifre.out", "w", stdout);

    scanf("%i %i %i %i", &A, &B, &C, &K);
    printf("%f\n", 1.0 * (Solve(B) - Solve(A - 1)) / (B - A + 1));
}