Cod sursa(job #3155109)

Utilizator AndreiBOTOBotocan Andrei AndreiBOTO Data 7 octombrie 2023 13:00:14
Problema Cifre Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.71 kb
#include <bits/stdc++.h>

#pragma optimize GCC ("Ofast")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")

///#include <tryhardmode>
///#include <GODMODE::ON>

using namespace std;

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

const int NMAX=15;
int dp[2][NMAX][NMAX][2];

int v[NMAX];
int cif,k;

double solve(int n)
{
    int kon=0,i,j,pref,digit,step,last,frecv;
    double total=0;
    bool curr=false;
    while(n)
    {
        v[++kon]=n%10;
        n/=10;
    }
    for(i=0;i<2;i++)
        for(j=0;j<NMAX;j++)
            for(digit=0;digit<=9;digit++)
                for(pref=0;pref<2;pref++)
                    dp[i][j][digit][pref]=0;
    for(i=1;i<=v[kon];i++)
    {
        if(i==cif)
        {
            if(v[kon]==i)
                dp[curr][1][i][1]=1;
            else
                dp[curr][1][i][0]=1;
        }
        else
        {
            if(v[kon]==i)
                dp[curr][0][i][1]=1;
            else
                dp[curr][0][i][0]=1;
        }
    }
    for(i=kon-1;i>=1;i--)
    {
        curr=!curr;
        for(j=1;j<=9;j++)
        {
            if(j==cif)
                dp[curr][1][j][0]=1;
            else
                dp[curr][0][j][0]=1;
        }
    }
    curr=false;
    for(i=kon-1;i>=1;i--)
    {
        for(j=0;j<=kon;j++)
            for(digit=0;digit<=9;digit++)
                for(pref=0;pref<2;pref++)
                {
                    for(step=0;step<=9;step++)
                    {
                        int memo=dp[curr][j][digit][pref];
                        if(memo)
                        {
                            if(pref==1 && v[i]<step)
                                continue;
                            int aux=1;
                            if(pref==1 && v[i]==step)
                                aux=1;
                            else
                                aux=0;
                            if(step==cif)
                                dp[!curr][j+1][step][aux]+=memo;
                            else
                                dp[!curr][j][step][aux]+=memo;
                        }
                    }
                }
        curr=!curr;
    }
    for(last=0;last<=9;last++)
        for(frecv=k;frecv<=kon;frecv++)
            total+=dp[curr][frecv][last][1]+dp[curr][frecv][last][0];
    return total;
}

int main()
{
    ios_base::sync_with_stdio(false);
    fin.tie(NULL);
    fout.tie(NULL);

    int a,b;
    fin>>a>>b>>cif>>k;
    double favorabil=solve(b)-solve(a-1);
    double posibil=b-a+1;
    fout<<fixed<<setprecision(4)<<favorabil/posibil;
    fin.close();
    fout.close();
    return 0;
}