Pagini recente » Cod sursa (job #3121022) | Cod sursa (job #2089517) | Cod sursa (job #260888) | Cod sursa (job #796805)
Cod sursa(job #796805)
#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;
}
else if ((a/pow10[j])%10<c)
{
if (prefix==0)
{
prefix=-1;
break;
}
prefix--;
act = true;
}
}
}
else
{
if (!act)
prefix = prefix * 10 + (a/pow10[j])%10 + (((a/pow10[j])%10>=c&&c!=0)?-1:0);
else
prefix = prefix * 10 + 9;
}
}
total+=prefix+1;
}
}
return total;
}
ifstream fin("cifre.in");
ofstream fout("cifre.out");
int main()
{
long long a,b,c,k,maxNR=0,otherwise;
fin >> a >> b >> c >> k;
if (((till(b,c,k) -till(a-1,c,k))*10000/(b-a+1) )*1.0/10000 == ((till(b,c,k) -till(a-1,c,k))*10000/(b-a+1) )/10000)
fout << ((till(b,c,k) -till(a-1,c,k))*10000/(b-a+1) )*1.0/10000<<".0000";
else
fout << ((till(b,c,k) -till(a-1,c,k))*10000/(b-a+1) )*1.0/10000;
}