Cod sursa(job #1615439)

Utilizator RadduFMI Dinu Radu Raddu Data 26 februarie 2016 16:13:53
Problema Cifre Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("cifre.in");
ofstream g("cifre.out");
 int cif[15],dp[15][15][15],s[15][15][15],st[15][15][15],stt[15][15][15];

void Solve(int n,int val,int nrk)
{ int i,j,k,t,sol=0;

  for(i=0;i<=9;i++)
   {if (i!=val) dp[1][i][0]=1;

     if (i==0) s[1][i][0]=dp[1][i][0];
      else s[1][i][0]=s[1][i-1][0]+dp[1][i][0];
   }

  dp[1][val][1]=1;

  if (val==0) s[1][0][1]=1;

  for(i=1;i<=9;i++)
   s[1][i][1]=dp[1][i][1]+s[1][i-1][1];



  for(i=2;i<=n;i++)
  {
      for(j=0;j<=9;j++)
       for(k=0;k<=nrk;k++)
        {if (j!=val)
          dp[i][j][k]+=s[i-1][9][k];
         else
          if (k>0)
             dp[i][j][k]+=s[i-1][9][k-1];


         if (j==0) s[i][j][k]=dp[i][j][k];
          else s[i][j][k]=s[i][j-1][k]+dp[i][j][k];
        }
  }

  for(i=1;i<=n;i++)
   for(j=0;j<=9;j++)
    { st[i][j][0]=dp[i][j][0];
      for(k=1;k<=nrk;k++)
       st[i][j][k]=st[i][j][k-1]+dp[i][j][k];
    }
}

int Ans(int x,int val,int nrk)
{ int i,j,nc=0,auxx=x,v[15],sol=0,startj;

  while(x)
  { nc++; v[nc]=x%10;
    x/=10;
  }
  Solve(nc,val,nrk);

 if (auxx>0 && !(val==0 && nrk==0)) sol=1;

  for(i=1;i<nc;i++)
   for(j=1;j<=9;j++)
     {sol+=st[i][j][nrk];
      //cout<<i<<" "<<j<<" "<<nrk<<" ="<<st[i][j][nrk]<<"\n";
     }

   // cout<<sol<<"\n";
  for(i=nc;i>=1;i--)
  {  if (i<nc) startj=0; else startj=1;
    for(j=startj;j<v[i];j++)
     {sol+=st[i][j][nrk];
    //  cout<<i<<" "<<j<<" "<<nrk<<" ="<<st[i][j][nrk]<<"\n";
     }
    if (v[i]==val) nrk--;
    if (nrk<0) break;
  }
 if (nrk>=0) sol++;

  return sol;
}
int main()
{ int n1,n2,val,nrk,res;
    f>>n1>>n2>>val>>nrk;

   res=Ans(n2,val,nrk-1);
  //  cout<<res;
    if (n1>0) res-=Ans(n1-1,val,nrk-1);
   res=n2-n1+1-res;

    // cout<<Ans(n1-1,val,nrk-1);

    g<<(double) res/(n2-n1+1);
    return 0;
}