Cod sursa(job #1044210)

Utilizator ericptsStavarache Petru Eric ericpts Data 29 noiembrie 2013 14:17:58
Problema Cifre Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

int a,b,c,k;

int DP[20][20][5];

int digit[20];

int solve(int lim){
    int many = 0,cpy = lim;
    while(cpy){
        ++many;
        digit[many] = cpy % 10;
        cpy /= 10;
    }
    reverse(digit + 1, digit + many + 1);
    memset(DP, 0, sizeof(DP));
    DP[0][0][1] = 1;

    for(int i = 0 ; i <= many ; ++i){
        for(int j = 0 ; j <= many ; ++j){
            for(int p = 0 ; p <= 1 ; ++p){
                if(p == 0){
                    DP[i+1][j][p] += DP[i][j][p] * 9;
                    DP[i+1][j+1][p] += DP[i][j][p];
                } else {
                    int mx = digit[i+1];

                    if(c > mx){
                        DP[i+1][j][p] += DP[i][j][p];
                        DP[i+1][j][0] += DP[i][j][p] * mx;
                    } else if (c == mx){
                        DP[i+1][j+1][p] += DP[i][j][p];
                        DP[i+1][j][0] += DP[i][j][p] * mx;
                    } else {
                        DP[i+1][j][p] += DP[i][j][p];
                        DP[i+1][j+1][0] += DP[i][j][p];
                        DP[i+1][j][0] += DP[i][j][p] * (mx - 1);
                    }
                }
            }
        }
    }

    int ret = 0;
    for(int j = k ; j <= many ; ++j)
        ret += DP[many][j][0] + DP[many][j][1];

    return ret;
}

int main(){
    freopen("cifre.in", "r", stdin);
    scanf("%d%d%d%d", &a, &b, &c, &k);
    int tot = solve(b) - solve(a - 1);
    double rez = tot;

    rez /= 1.0 * (b - a + 1);
    freopen("cifre.out", "w", stdout);
    printf("%lf", rez);
}