Cod sursa(job #112217)

Utilizator stef2nStefan Istrate stef2n Data 3 decembrie 2007 20:49:35
Problema Cifre Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <cstdio>
#include <utility>
using std::pair;
using std::make_pair;

int A, B, C, K;

pair <int, int> first(int A)
{
    int p10=1;
    while(A>9)
    {
        A/=10;
        p10*=10;
    }
    return make_pair(A,p10);
}

int solve(int A, int C, int K, bool can_I_put_0)
{
    if(!K)
        return A+1;
    if(A<10)
        return K==1 && A>=C;
    pair <int, int> p = first(A);
    int sol=0;
    int tmp=solve(p.second-1,C,K,true);
    for(int i=can_I_put_0==true ? 0 : 1; i<p.first; ++i)
        if(i!=C)
            sol+=tmp;
        else
            sol+=solve(p.second-1,C,K-1,true);
    if(p.first==C && can_I_put_0)
        sol+=solve(A%p.second,C,K-1,true);
    else
        sol+=solve(A%p.second,C,K,true);
    return sol;
}


int main()
{
    freopen("cifre.in","r",stdin);
    freopen("cifre.out","w",stdout);
    scanf("%d %d %d %d", &A, &B, &C, &K);
    int cntB = solve(B,C,K,C!=0);
    int cntA = (A==0) ? 0 : solve(A-1,C,K,C!=0);
    printf("%.4lf\n",(double)(cntB-cntA)/(double)(B-A+1));
    return 0;
}