Cod sursa(job #2614022)

Utilizator Rares31100Popa Rares Rares31100 Data 11 mai 2020 00:41:14
Problema Cifre Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <bits/stdc++.h>

using namespace std;

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

int A,B,nrAp,cif;

long long fact(int nr)
{
    long long p=1;
    while(nr)
        p*=nr--;

    return p;
}

int combinari(int n,int k)
{
    if(n<k)
        return 0;

    long long rez=fact(n)/(fact(n-k)*fact(k));

    return rez;
}

int putere(int nr,int times)
{
    if(times<0)
        return 0;

    int p=1;
    while(times--)
        p*=nr;

    return p;
}

int findNumere(int maxim, int aparTot, int cif)
{
    int l=log10(maxim)+1,poz[11];
    for(int i=l;i>=1;i--)
    {
        poz[i]=maxim%10;
        maxim/=10;
    }

    int aparLoc=0,sum=0;
    for(int i=1;i<=l;i++)
        if(poz[i]>cif)
        {
            sum+=(poz[i]-1)*combinari(l-i,aparTot-aparLoc)*putere(9, l-i-(aparTot-aparLoc) );

            if(aparLoc<aparTot)
                sum+=combinari(l-i,aparTot-aparLoc-1)*putere(9, l-i-(aparTot-aparLoc-1) );
        }
        else
        {
            sum+=poz[i]*combinari(l-i,aparTot-aparLoc)*putere(9, l-i-(aparTot-aparLoc) );

            if(poz[i]==cif)
                aparLoc++;
            if(aparLoc>aparTot)
                break;
        }

    if(poz[l]==cif && aparLoc==aparTot)
        sum++;

    return sum;
}

int hasMin(int nr,int aparMin,int cif)
{
    int apar=0;
    while(nr)
    {
        if(nr%10==cif)
            apar++;
        nr/=10;
    }

    if(apar>=aparMin)
        return apar-aparMin+1;
    return 0;
}

int main()
{
    in>>A>>B>>cif>>nrAp;

    double long found=hasMin(A,nrAp,cif);
    for(int i=nrAp;i<=10;i++)
        found+=findNumere(B,i,cif)-findNumere(A,i,cif);

    out<<setprecision(4)<<fixed<<found/(B-A+1);

    return 0;
}