Cod sursa(job #1599991)

Utilizator algebristulFilip Berila algebristul Data 14 februarie 2016 16:27:51
Problema Cifre Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int A, B, C, K;
int D[13][13][2][2];

int solve(int x) {
    memset(D, 0, sizeof(D));
    int v[13];
    int digits = 0;

    while (x) {
        v[++digits] = x % 10;
        x /= 10;
    }

    reverse(v + 1, v + digits + 1);

    D[0][0][1][1] = 1;

    for (int i = 0; i <= digits; i++) {
        for (int j = 0; j <= i; j++) {
            for (int k = 0; k < 2; k++) { // all zeros
                for (int l = 0; l < 2; l++) { // all equal
                    for (int d = 0; d <= 9; d++) {
                        if (l == 1 && d > v[i + 1])
                            continue;

                        int i1, j1, k1, l1;

                        i1 = i + 1;
                        j1 = j + ((d == C) ? 1 : 0);

                        if (k == 1 && C == 0 && C == d) {
                            j1--;
                        }

                        if (d == 0 && k == 1)
                            k1 = 1;
                        else
                            k1 = 0;

                        if (d == v[i + 1] && l == 1)
                            l1 = 1;
                        else
                            l1 = 0;

                        D[i1][j1][k1][l1] += D[i][j][k][l];
                    }
                }
            }
        }
    }

    int ans = 0;
    
    for (int k = K; k <= digits; k++) {
        ans += D[digits][k][0][1] + D[digits][k][0][0];
    }

    return ans;
}

int main() {
    freopen("cifre.in", "r", stdin);
    freopen("cifre.out", "w", stdout);

    scanf("%d %d %d %d", &A, &B, &C, &K);

    long long cnt = solve(B) - solve(A - 1);
    double ans = 1. * cnt / (B - A + 1);

    printf("%.4lf\n", ans);

    return 0;
}