Pagini recente » Cod sursa (job #236588) | Cod sursa (job #1319418) | Cod sursa (job #2096489) | Cod sursa (job #2271857) | Cod sursa (job #496499)
Cod sursa(job #496499)
#include<cstdio>
const int MC=1<<4;
int q,a,b,c,k,nrb,rez,v[MC],vd[MC];
bool ok;
void rastorn(int A[MC])
{
int aux,st=0,dr=q+1;
while(++st<--dr)
aux=A[st], A[st]=A[dr], A[dr]=aux;
}
void reset(int A[MC])
{
for(int i=0;i<MC;i++)
A[i]=0;
}
void back(int poz,int lung)
{
if(poz>lung)
{
if(nrb>=k)
{
int prod=1;
for(int i=1;i<=lung;i++)
if(vd[i]==1)
prod*=9;
rez+=prod;
}
return;
}
for(int i=0;i<2;i++)
{
if(i==0)
nrb++;
vd[poz]=i;
back(poz+1,lung);
if(i==0)
nrb--;
}
}
void backs(int poz,int lung)
{
if(poz>lung)
{
if(nrb>=k)
{
int prod=1;
for(int i=1;i<=lung;i++)
if(vd[i]==1)
prod*=9;
rez+=prod;
}
return;
}
for(int i=0;i<2;i++)
{
if(i==0 && ok)
{
nrb++;
vd[poz]=i;
backs(poz+1,lung);
nrb--;
}
else if(i==1 && ok==false)
{
ok=true;
vd[poz]=i;
backs(poz+1,lung);
ok=false;
}
else if(i==1)
{
vd[poz]=i;
backs(poz+1,lung);
}
}
}
void solve(int poz)
{
if(poz>q)
return;
int x=0;
int lim=v[poz];
if(poz<q)
lim--;
for(int i=0;i<=lim;i++)
{
if(i==c)
nrb++;
if(c==0 && poz==1)
backs(1,q-poz);
back(1,q-poz);
if(i==c)
nrb--;
}
if(v[poz]==c)
nrb++;
solve(poz+1);
}
int pregen(int x)
{
reset(v);
q=0;
nrb=0;
while(x)
v[++q]=x%10, x/=10;
rastorn(v);
solve(1);
}
int main()
{
freopen("cifre.in","r",stdin);
freopen("cifre.out","w",stdout);
scanf("%d%d%d%d",&a,&b,&c,&k);
pregen(b);
int x;
x=rez;
rez=0;
pregen(a-1);
x-=rez;
printf("%.4f",(double)x/(double)(b-a+1));
return 0;
}