Cod sursa(job #720850)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 22 martie 2012 23:20:08
Problema Cifre Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <fstream>
#include <iomanip>

#define CMax 12

using namespace std;

const int N=10;
int C, K, DP[CMax][CMax][CMax];

void Initialize ()
{
    for (int c=0; c<10; ++c)
    {
        if (c==C) DP[1][1][c]=1;
        else DP[1][0][c]=1;
    }
    for (int c=1; c<10; ++c)
    {
        DP[1][0][c]+=DP[1][0][c-1];
        DP[1][1][c]+=DP[1][1][c-1];
    }
}

void SolveDP ()
{
    Initialize ();
    for (int i=2; i<N; ++i)
    {
        for (int k=0; k<=i; ++k)
        {
            for (int c=0; c<10; ++c)
            {
                if (c>0) DP[i][k][c]=DP[i][k][c-1];
                if (c==C)
                {
                    if (k>0) DP[i][k][c]+=DP[i-1][k-1][9];
                }
                else DP[i][k][c]+=DP[i-1][k][9];
            }
        }
    }
    for (int i=1; i<N; ++i)
    {
        for (int k=i-1; k>=0; --k)
        {
            for (int c=0; c<10; ++c)
            {
                DP[i][k][c]+=DP[i][k+1][c];
            }
        }
    }
}

inline int Query (int X)
{
    int Digits[CMax];
    Digits[0]=0;
    for (; X>0; Digits[++Digits[0]]=X%10, X/=10);
    int S=DP[Digits[0]][K][9];
    for (int i=Digits[0], k=K; i>0; --i)
    {
        S-=(DP[i][k][9]-DP[i][k][Digits[i]]);
        if (Digits[i]==C) --k;
    }
    return S;
}

int main()
{
    ifstream fin ("cifre.in");
    ofstream fout ("cifre.out");
    int A, B;
    fin >> A >> B >> C >> K;
    SolveDP ();
    fout << fixed << setprecision (4) << 1.0*(Query (B)-Query (A-1))/(B-A+1) << "\n";
    return 0;
}