Cod sursa(job #549862)
#include <fstream>
#include <cstdio>
using namespace std;
int v[10][10],a,b,k,C;
ifstream in("cifre.in");
int inv(int x)
{
int q;
for (q=0;x;q=q*10+x%10,x/=10);
return q;
}
int ncif(int x)
{
int p;
for (p=0;x;x/=10,p++);
return p;
}
inline int max(int a,int b)
{
return a>b ? a:b;
}
bool ok(int x)
{
int i;
for (i=0;x;x/=10)
i+=(x%10==k);
return i>=C;
}
int nr(int x)
{
int rez=ok(x),nr=C,q=ncif(x)-1;
bool st=true;
for (x=inv(x);x;x/=10,q--)
{
if (x%10<=k || k==0 && st)
rez+=(x%10)*v[q][max(nr,0)];
else
rez+=max(x%10-1,0)*v[q][max(nr,0)]+v[q][max(nr-1,0)];
nr-=(x%10==k);
st=false;
}
return rez;
}
int main()
{
v[0][0]=1;
int q=9;
in>>a>>b>>k>>C;
for (int i=1;i<10;i++)
for (int j=i;j>=0;j--)
v[i][j]=v[i-1][j-1]+v[i-1][j]*q;
for (int i=1;i<10;i++)
for (int j=i;j>=0;j--)
v[i][j]+=v[i][j+1];
freopen("cifre.out","w",stdout);
printf("%.4lf\n",(double)(nr(b)-nr(a-1))/(b-a+1));
return 0;
}