Cod sursa(job #796802)

Utilizator mipsPavel Mircea mips Data 12 octombrie 2012 16:37:20
Problema Cifre Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.4 kb
#include <fstream>
#include <iostream>
using namespace std;
long long till(long long a,long long c,long long k)
{
    if ((a==0)&&(c==0)&&(k==1))
    return 1;
    long long pow10[10];
    pow10[0]=1;
    for (long long i=1; i<=10; i++)
        pow10[i]=pow10[i-1]*10;

    long long total=0,nrDig=0;

    for (long long i=0; i<1<<nrDig; i++)
    {
        //pentru fiecare posibilitate
        long long nr1=0;
        for (long long j=0; j<nrDig; j++)
            if (i&(1<<j))
                nr1++;
        //nr de 1-uri
        long long prefix=0;
        bool act=false;
        nrDig=10;
        if (nr1 >= k)
        {
            for (long long j=nrDig-1; j>=0; j--)
            {
                if (i&(1<<j))
                {
                    if ((prefix<=0)&&(c==0))
                    {
                        prefix=-1;
                        break;
                    }
                    if (!act)
                    {
                        if ((a/pow10[j])%10>c)
                        {
                            act = true;
        //                    cout << "act"<<endl;
                        }

                        else if ((a/pow10[j])%10<c)
                        {
                            if (prefix==0)
                            {
                                prefix=-1;
                                break;
                            }
                            prefix--;
                            act = true;
      //                      cout << "act"<<endl;
                        }

                    }
                 //   prefix*=10;
                }
                else
                {
                    if (!act)
                        prefix = prefix * 10 +  (a/pow10[j])%10 + (((a/pow10[j])%10>=c&&c!=0)?-1:0);
                    else
                        prefix = prefix * 10 +  9;

                }

            }
          //  if (prefix+1!=0)
           // cout << i << "add : " <<prefix+1<<endl;
            total+=prefix+1;
            //if ((prefix==0)&& valid) total++;
        }
    }
    //cout << "imi da " <<total<<endl;
    return total;
}
ifstream fin("cifre.in");
ofstream fout("cifre.out");
int main()
{
    long long a,b,c,k,maxNR=0,otherwise;

    //cout << till(0,0,1);
    fin >> a >> b >> c >> k;

    fout << ((till(b,c,k) -till(a-1,c,k))*10000/(b-a+1) )*1.0/10000;
}
/*
10 10 12 13
01 01
11
/*59980
   1 1
  59990

  99
  11

  590
  */