Cod sursa(job #2200354)

Utilizator felixiPuscasu Felix felixi Data 1 mai 2018 08:23:46
Problema Cifre Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <bits/stdc++.h>
using namespace std;

ifstream in("cifre.in");
ofstream out("cifre.out");

const int NMAX = 1e9;

int K, C;
int comb[20][20], fac[20];

void precalc()
{
    comb[0][0] = 1;
    for( int i = 1;  i <= 18;  ++i ) {
        comb[i][0] = 1;
        for( int j = 1;  j <= 18;  ++j )
            comb[i][j] = comb[i - 1][j] + comb[i - 1][j - 1];

    }
}

int formula(int nr, int fix)
{
    int coef = comb[nr][fix];
    for( int i = 1;  i <= nr - fix;  ++i )
        coef = coef * 9;
    return coef;
}

int solve(int val)
{
    int v[12];
    int ind = 0;
    while( val ) {
        v[++ind] = val % 10;
        val /= 10;
    }
    int ans = 0;
    reverse(v+1, v+ind+1);
    for( int pre = 0, nrc = 0;  pre <= ind;   ++pre ) {
        if( pre == ind ) {
            ans += (nrc >= K);
            break;
        }

        for( int c = v[pre + 1] - 1;  c >= 0;  --c ) {
            int cifre = nrc + (c == C);
            int liber = ind - pre - 1;
            for( int more = 0;  more <= liber;  ++more ) {
                if( cifre + more >= K ) {
                    ans += formula(liber, more);
                }
            }
        }

        nrc += (v[pre + 1] == C);
    }
    return ans;
}

int main()
{
    precalc();

    int A, B;
    in >> A >> B >> K >> C;
    out << fixed << setprecision(12) << (solve(B) - solve(A - 1)) * 1.0 / (B - A + 1) << '\n';
    return 0;
}