Cod sursa(job #1044220)

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

using namespace std;

int a,b,c,k;

int DP[20][20][2][2];

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][0] = 1;

    for(int i = 0 ; i <= many ; ++i){
        for(int j = 0 ; j <= many ; ++j){
            for(int p = 0 ; p <= 1 ; ++p){
                for(int l = 0 ; l <= 1 ; ++l){
                    for(int d = 0 ; d <= 9 ; ++d){
                        if(p == 1 && d > digit[i + 1])
                            break;
                        int _i, _j, _p, _l;
                        _i = i + 1;
                        _j = j + ( (d == c) && (c || l) );
                        _p = p && (d == digit[_i]);
                        _l = l || d;
                        DP[_i][_j][_p][_l] += DP[i][j][p][l];
                    }
                }
            }
        }
    }

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

    return ret + (c == 0);
}

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);
}