Cod sursa(job #2703534)

Utilizator stefantagaTaga Stefan stefantaga Data 8 februarie 2021 18:41:44
Problema Cifre Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.11 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("cifre.in");
ofstream g("cifre.out");
int a,b,c,k,valori[15],i;
int val(int x)
{
    if (x==c)
    {
        return 1;
    }
    int copie=x,i,q,v[15],sum=0,lim,j,numar,ok[15],t,start,cif,p;
    memset(v,0,sizeof(v));
    memset(ok,0,sizeof(ok));
    q=0;
    while (copie)
    {
        v[++q]=copie%10;
        copie=copie/10;
    }
    reverse(v+1,v+q+1);
    lim=(1<<q);
    sum=0;
    for (i=0;i<lim;i++)
    {
        numar=0;
        for (j=0;j<q;j++)
        {
            if ((i&(1<<j))!=0)
            {
                numar++;
                ok[j+1]=1;
            }
            else
            {
                ok[j+1]=0;
            }
        }
        if (numar>=k)
        {
            int ok1=1;
            for (j=0;j<q;j++)
            {
                for (t=1;t<=j;t++)
                {
                    if (ok[t]==1&&v[t]!=c)
                    {
                        ok1=0;
                        break;
                    }
                    if (ok[t]==0&&v[t]==c)
                    {
                        ok1=0;
                        break;
                    }
                }
                if (ok1==0)
                {
                    break;
                }
                if (ok[j+1]==1)
                {
                    if (v[j+1]==c)
                    {
                        continue;
                    }
                    p=1;
                    for (int t2=j+2;t2<=q;t2++)
                    {
                        if (ok[t2]==0)
                        {
                            p=p*9;
                        }
                    }
                    sum+=p;
                }
                else
                {
                    if (j+1==1)
                {
                    start=1;
                }
                else
                {
                    start=0;
                }
                for (cif=start;cif<=v[t];cif++)
                {
                    if (cif==c)
                    {
                        continue;
                    }
                    p=1;
                    for (int t2=j+2;t2<=q;t2++)
                    {
                        if (ok[t2]==0)
                        {
                            p=p*9;
                        }
                    }
                    sum=sum+p;
                }
                }
            }
        }
    }
    return sum;
}
int val2(int x)
{
    int copie=x,q=0,sum=0;
    while (copie)
    {
        copie=copie/10;
        q++;
    }
    for (i=1;i<q;i++)
    {
        sum+=valori[i];
    }
    return sum+val(x);
}
int p,valfin,st;
int main()
{
    f>>a>>b>>c>>k;
    assert(c!=0);
    p=9;
    for (i=1;i<=9;i++)
    {
        valori[i]=val(p);
        p=p*10+9;
    }
    if (a==0)
    {
        st=0;
    }
    else
    {
        st=val2(a-1);
    }
    valfin=val2(b)-st;
    g<<valfin<<'\n';
    g<<fixed<<setprecision(4)<<(double)valfin/(b-a+1);
    return 0;
}