Cod sursa(job #846979)

Utilizator dtoniucDaniel Toniuc dtoniuc Data 3 ianuarie 2013 00:43:50
Problema Cifre Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <iostream>
#include <fstream>
#include <iomanip>
#include <map>

using namespace std;

int A,B,C,K;
map<pair<pair<int, int>, bool>, int> M;
map<pair<pair<int, int>, bool>, bool> F;

int cifre(int x)
{
    int cif=0;
    while (x)
    {
        cif++;
        x/=10;
    }
    return cif;
}
int rezolva(int n, int k,bool z)
{
    if(F[make_pair(make_pair(n,k),z)]) return M[make_pair(make_pair(n,k),z)];
    else
    {
        if(k<=0) return n+1;
        else if(n<=9 && n>=C && k==1) return 1;
        else if(n<=9) return 0;

        int cif=cifre(n),aux=cif,putere,rezultat=0;;
        for(putere=1;aux>1;--aux)
            putere*=10;

        for(int i=0; putere*(i+1)<=n;++i)
        {
            if(i!=0)
                rezultat+=rezolva(putere-1,k - (i==C),true);
            else
            {
                if(z)
                    rezultat+=rezolva(putere-1,k - (i==C),true);
                else
                    rezultat+=rezolva(putere-1,k,false);
            }
        }

        aux=n/putere;
        int u=n-aux*putere;
        int ucif=cifre(u);
        rezultat+=rezolva(u,k-(aux==C)-(C==0 ? cif-ucif-1:0),true);

        M[make_pair(make_pair(n,k),z)]=rezultat;
        F[make_pair(make_pair(n,k),z)]=true;
        return rezultat;
    }
}
int main()
{
    ifstream fin("cifre.in");
    ofstream fout("cifre.out");
    fin>>A>>B>>C>>K;
    int a=rezolva(B,K,false)-(A == 0 ? 0:rezolva(A-1,K,false));
    fout<<fixed<<setprecision(4)<<double(1.0)*a/(B-A+1);
    fin.close();
    fout.close();
    return 0;
}