Cod sursa(job #1487117)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 16 septembrie 2015 09:40:50
Problema Cifre Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
#include <iomanip>
using namespace std;
ifstream f("cifre.in");
ofstream g("cifre.out");
int A,B,C,K;
int getAns(int A,int B)
{
    int ans=0;
    for(int i=A;i<=B;i++)
    {
        int aux=i,cnt=0;
        while(aux!=0)
        {
            if(aux%10==K)
                ++cnt;
            aux/=10;
        }
        if(cnt>=C)
            ++ans;
    }
    return ans;
}
int Comb(int x,int y)
{
    if(y>x)
        return 0;
    if(y<=0)
        return 10000;
    if(y==1)
        return 2916;
    if(y==2)
        return 81*6;
    if(y==3)
        return 36;
    if(y==4)
        return 1;

}
int Count(int first,int last)
{
    int aux=first,cnt=0;
    aux/=10000;
    while(aux!=0)
    {
        if(aux%10==K)
            ++cnt;
        aux/=10;
    }
    return Comb(4,C-cnt);

}
int main()
{
    f>>A>>B>>K>>C;
    if(B-A<=10000)
        g<<fixed<<setprecision(4)<<(double)getAns(A,B)/(double)(B-A+1)<<"\n";
    else
    {
        int first=A/10000+1;
        first*=10000;
        int second=B/10000;
        second*=10000;
        int ans=0;
        ans+=getAns(A,first-1);
        ans+=getAns(second+1,B);
        for(int i=first;i<second;i+=10000)
        {
            ans+=Count(i,i+10000);

        }
        g<<fixed<<setprecision(4)<<(double)ans/(double)(B-A+1)<<"\n";
    }
    return 0;
}