Cod sursa(job #800721)

Utilizator SchumiDumitru Andrei Georgian Schumi Data 22 octombrie 2012 13:17:02
Problema Cifre Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <cassert>
#include <cstdio>

#include <algorithm>
#include <vector>

using namespace std;

const int N = 15;

int a, b, c, k, K;
int d[N][N][2][2];
vector <int> nrb;

void read() {
    assert(freopen("cifre.in", "r", stdin) != NULL);
    assert(freopen("cifre.out", "w", stdout) != NULL);

    assert(scanf("%d %d %d %d", &a, &b, &c, &K) == 4);
}

int digits(int x) {
    int ans = 0;
    nrb.clear();

    do {
        ++ans;
        nrb.push_back(x % 10);
        x /= 10;
    }while (x);
    
    reverse(nrb.begin(), nrb.end());

    return ans;
}

int dinamica(int b) {
    int n = digits(b);
    d[0][0][1][0] = 1;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            for (int k = 0; k <= 1; ++k) {
                for (int l = 0; l <= 1; ++l) {
                    for (int digit = 0; digit <= 9; ++digit) {
                        if (k == 1 && digit > nrb[i])
                            continue;

                        int new_i = i + 1;
                        int new_j = j;
                        if (digit == c && (c != 0 || l == 1))
                            ++new_j;

                        int new_k = 0;
                        if (k == 1 && digit == nrb[i])
                            new_k = 1;

                        int new_l = 1;
                        if (l == 0 && digit == 0)
                            new_l = 0;
                        
                        d[new_i][new_j][new_k][new_l] += d[i][j][k][l];
                    }
                }
            }
        }
    }

    int sola = 0;
    int na = digits(a);
    for (int j = K; j <= na; ++j) {
        sola += d[na][j][0][1] + d[na][j][1][1];
    }
    
    int solb = 0;
    for (int j = K; j <= n; ++j)
        solb += d[n][j][0][1] + d[n][j][1][1];
    
    if (c == 0) {
        ++sola;
        ++solb;
    }

    return solb - sola + 1;
}

int main() {
    read();
    //b = 99;
    //c = 2;
    //K = 1;
    printf("%lf\n", dinamica(b) / (b - a + 1.0));
}