Pagini recente » Cod sursa (job #2688188) | Cod sursa (job #306756) | Cod sursa (job #194118) | Cod sursa (job #194195) | Cod sursa (job #796802)
Cod sursa(job #796802)
#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
*/