Cod sursa(job #835326)

Utilizator stoicatheoFlirk Navok stoicatheo Data 16 decembrie 2012 01:05:06
Problema Cifre Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <cassert>
#include <cstdio>
#include <cstring>
 
#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) {
    memset(d, 0, sizeof(d));
    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 sol = 0;
    for (int j = K; j <= n; ++j)
        sol += d[n][j][0][1] + d[n][j][1][1];
     
    if (c == 0) {
        ++sol;
    }
 
    return sol;
}
 
int main() {
    read();
    printf("%lf\n", (dinamica(b) - dinamica(a - 1)) / (b - a + 1.0));
}