Cod sursa(job #1303532)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 28 decembrie 2014 01:20:09
Problema Cifre Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <fstream>

#include <cstdio>
using namespace std;

const int MAX_N = 12;

int A, B, C, K;
int D[MAX_N][MAX_N];

int solve(int n, int k) {
    if(n < 0)
        return 0;
    if(n == 0) {
        if(k == 1 && C == 0)
            return 1;
        else return 0;
    }

    int nr = 0;
    int a[MAX_N];

    while(n) {
        a[++nr] = n % 10;
        n /= 10;
    }

    for(int i = 1, j = nr; i < j; ++i, --j)
        swap(a[i], a[j]);

    int ret = 0, cnt = 0;
    for(int i = 1; i <= nr; ++i) {
        int t = 1;
        if(i == nr)
            t = 0;
        for(int j = 0; j <= a[i] - t; ++j) {
            if(j == C) {
                if(cnt < k)
                    ret += D[nr - i][k - cnt - 1];
            }
            else ret += D[nr - i][k - cnt];
        }

        if(a[i] == C)
            ++cnt;
        if(cnt > k)
            break;
    }

    return ret;
}

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

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


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

    for(int i = 2; i <= 10; ++i)
        for(int j = 0; j <= i; ++j)
            D[i][j] = D[i - 1][j] * 9 + D[i - 1][j - 1];

    int a = 0, b = B - A + 1;
    for(int i = K; i <= 10; ++i)
        a += solve(B, i) - solve(A - 1, i);

    printf("%.4lf\n", (double) a / b);

    fclose(stdin);
    fclose(stdout);

    return 0;
}