Cod sursa(job #1303564)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 28 decembrie 2014 03:51:03
Problema Cifre Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.06 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 == 0 || (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]);

    if(k > nr)
        return 0;

    int ret = 0, cnt = 0;
    if(C != 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;
        }
    }
    else {
        if(k == 1)
            ++ret;
        for(int i = 1; i < nr; ++i)
            ret += 9 * D[i - 1][k];
        for(int i = 1; i <= nr; ++i) {
            if(a[i] > 0)
                ret += (a[i] - 1) * D[nr - i][k - cnt];
            if(a[i] > 0 && cnt < k && i > 1)
                ret += D[nr - i][k - cnt - 1];

            if(a[i] == C)
                ++cnt;
            if(i == nr && cnt == k)
                ++ret;
            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;
            if(j > 0)
                D[i][j] += 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;
}