Cod sursa(job #908756)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 9 martie 2013 23:06:48
Problema Cifre Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <fstream>
using namespace std;
#include <iomanip>
#define ll long long
ll a,b,c,k;
ifstream f("cifre.in");ofstream g("cifre.out");
ll dp[66][66],v[666],cif100[66][66];
ll i,j;
ll din(ll val,ll cif){
    ll i,j,n=0,result=0;

    for(i=0;i<=15;++i)
      for(j=0;j<=15;++j) dp[i][j]=0;
    if (val<10) return(cif>val?0:1);
    for(i=1;i<=10;++i) v[i]=0;
    for(;val;val/=10) v[++n]=val%10;

    if (v[1]>=cif) dp[1][1]=1,dp[1][0]=v[1];
    else dp[1][0]=v[1]+1;

    for(i=2;i<=n;++i)
      for(j=0;j<=10;++j){
         dp[i][j]+=cif100[i-1][j]*v[i];

        if (j!=0){
         if (v[i]==cif) dp[i][j]+=dp[i-1][j-1];
         else dp[i][j]+=dp[i-1][j];
        }
      }

    for(j=k;j<=10;++j) result+=dp[n][j];
    return result;
}
int main()
{
   f>>a>>b>>c>>k;
   cif100[0][0]=1;

   for(i=1;i<=10;++i)
       for(j=0;j<=i;++j)
         cif100[i][j]+=cif100[i-1][j]*9,
         cif100[i][j]+=cif100[i-1][j-1];

    ll result=din(b,c)-din(a-1,c);
    g<<fixed;
    g<<setprecision(4);

    double ree=((double)result/(double)(b-a+1));
    if (k==0) g<<0.0000<<'\n';else
    g<<ree<<'\n';

    f.close();g.close();
    return 0;
}