Cod sursa(job #2040890)

Utilizator Bodo171Bogdan Pop Bodo171 Data 16 octombrie 2017 17:31:58
Problema Cifre Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
int dp[12][12][12][2];
int v[12];
int A,B,K,C,i,j,k,ind,newind,newk,nr,idx;
double t,T;
int calc(int x)
{
    int ret=0;
    nr=0;
    while(x!=0)
    {
        v[++nr]=x%10;
        x/=10;
    }
    for(i=1;i<=nr;i++)
        for(j=0;j<10;j++)
          for(k=1;k<=nr;k++)
            for(ind=0;ind<2;ind++)
               dp[i][j][k][ind]=0;
    for(j=1;j<=v[nr];j++)
    {
        if(j==C) k=1;
        else k=0;
        if(j==v[nr]) ind=1;
        else ind=0;
        dp[nr][j][k][ind]=1;
    }
    for(i=1;i<nr;i++)
        for(j=1;j<=9;j++)
    {
        if(j==C) k=1;
        else k=0;
        dp[i][j][k][0]=1;
    }
    for(i=nr;i>=2;i--)
        for(j=0;j<10;j++)
          for(k=0;k<=nr;k++)
            for(ind=0;ind<2;ind++)
    {
        for(idx=0;idx<10;idx++)
            {
                if(idx==C) newk=k+1;
                else newk=k;
                if((idx<=v[i-1]&&ind==1)||ind==0)
                {
                    if(idx==v[i-1]&&ind==1) newind=1;
                    else newind=0;
                    dp[i-1][idx][newk][newind]+=dp[i][j][k][ind];
                }
            }
    }
    for(i=0;i<9;i++)
        for(k=K;k<=nr;k++)
          ret+=dp[1][i][k][0]+dp[1][i][k][1];
    if(nr>=0&&K==0&&C<=1)
        ret++;
    return ret;
}
int main()
{
    ifstream f("cifre.in");
    ofstream g("cifre.out");
    f>>A>>B>>C>>K;
    t=calc(B)-calc(A-1);
    T=B-A+1;
    g<<fixed<<setprecision(4)<<t/T;
    return 0;
}