Cod sursa(job #338973)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 7 august 2009 17:10:42
Problema Cifre Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.25 kb
# include <cstdio>

using namespace std;

# define FIN "cifre.in"
# define FOUT "cifre.out"
# define max(a, b) (a > b ? a : b)
# define MAX_N 10

double Sol;
int A, B, C, K;
int Din[MAX_N][MAX_N];
int Pow[MAX_N][MAX_N];
int Comb[MAX_N][MAX_N];

    void Preproc()
    {
        int i, j;
        
        for (i = 0; i <= 9; ++i) Comb[i][0] = Pow[i][0] = 1;
        for (i = 1; i <= 9; ++i)
           for (j = 1; j <= i; ++j)
           {
              Pow[i][j] = Pow[i][j - 1] * i;
              Comb[i][j] = Comb[i - 1][j - 1] + Comb[i - 1][j];
           }
        
        Din[0][0] = 1;
        for (i = 1; i <= 9; ++i)
           for (j = i; j >= 0; --j)
              Din[i][j] = Din[i][j + 1] + Comb[i][j] * Pow[9][i - j];
    }
    
    int Compute(int N, int K)
    {
        int A[MAX_N];
        int i , ct, Sol;
        
        if (!N)
        {
            if (!C && K <= 1) return 1;
            return 0;
        }
        
        Sol = ct = 0;
        while (N)
        {
           A[++ct] = N % 10;
           N /= 10;
        }
        
        if (!C && K <= 1) ++Sol;
        for (i = 1; i < ct; ++i)
        {
            if (!C) Sol += 9 * Din[i - 1][K];
            else Sol += Din[i - 1][max(K - 1, 0)] + 8 * Din[i - 1][K];
        }
        
        if (C && C < A[ct])
             Sol += Din[ct - 1][max(K - 1, 0)] + (A[ct] - 2) * Din[ct - 1][K];
        else Sol += (A[ct] - 1) * Din[ct - 1][K];
        
        if (A[ct] == C) K = max(K - 1, 0);
        
        for (i = ct - 1; i >= 1; --i)
        {
            if (C < A[i])
                 Sol += Din[i - 1][max(K - 1, 0)] + (A[i] - 1) * Din[i - 1][K];
            else Sol += A[i] * Din[i - 1][K];
            
            if (A[i] == C) K = max(K - 1, 0);
        }
        
        if (!K) ++Sol;
        
        return Sol;
    }

    int main()
    {
        freopen(FIN, "r", stdin);
        freopen(FOUT, "w", stdout);
        
        Preproc();
        
        scanf("%d%d%d%d", &A, &B, &C, &K);
        
        Sol = (double) Compute(B, K);
        if (A) Sol -= (double) Compute(A - 1, K);
        
        Sol /= (double) (B - A + 1);
        printf("%.4f", Sol);
                
        return 0;
    }