Cod sursa(job #2614026)

Utilizator Rares31100Popa Rares Rares31100 Data 11 mai 2020 01:04:17
Problema Cifre Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 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(aparTot-aparLoc==1 && poz[l]>=cif)
        sum++;
    else if(aparTot==aparLoc)
        sum+=poz[l]+1-(poz[l]>=cif?1:0);

    return sum;
}

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

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

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

    return 0;
}