Pagini recente » Cod sursa (job #1029979) | Cod sursa (job #376040) | Cod sursa (job #122414) | Infoarena Monthly 2012 - concursul comunitatii, Editia I | Cod sursa (job #2017620)
#include <stdio.h>
#include <stdlib.h>
long long d[11][11],nr,nra,nrb;
int v[11];
long long f(int n,int k,int c)
{
int i,j,kc=k,ct;
long long x=0,aux;
for(i=1; i<=n && k; i++)
{
for(j=1; j<v[i]; j++)
if(j==c)
for(ct=1; ct<=n-i; ct++)
x+=d[ct][k-1];
else
for(ct=1; ct<=n-i; ct++)
x+=d[ct][k];
if(i>1 && v[i]>0)
if(c==0)
for(ct=1; ct<=n-i; ct++)
x+=d[ct][k-1];
else
for(ct=1; ct<=n-i; ct++)
x+=d[ct][k];
if(v[i]==c)
k--;
if(k==0)
break;
}
aux=0;
for(j=i+1; j<=n; j++)
aux=aux*10+v[j];
if(aux>0) aux++;
x+=aux;
for(i=1; i<n; i++)
x+=d[i][kc];
return x;
}
int main()
{
int a,b,c,k,i,j,cp,cif,kc,dif;
freopen("cifre.in","r",stdin);
freopen("cifre.out","w",stdout);
scanf("%d%d%d%d",&a,&b,&c,&kc);
dif=b-a+1;
d[1][0]=10;
d[2][0]=90;
d[3][0]=900;
d[4][0]=9000;
d[5][0]=90000;
d[6][0]=900000;
d[7][0]=9000000;
d[8][0]=90000000;
d[9][0]=900000000;
d[10][0]=9000000000LL;
d[1][1]=1;
for(i=2; i<=10; i++)
for(j=1; j<=i; j++)
if(c==0)
{
nr=0;
for(k=1; k<i; k++)
nr+=d[k][j];
d[i][j]=9LL*nr;
}
else
{
nr=0;
for(k=1; k<i; k++)
nr+=d[k][j];
d[i][j]=8LL*nr;
nr=0;
nr=0;
for(k=1; k<i; k++)
nr+=d[k][j-1];
d[i][j]+=nr;
}
a--;
if(a<=0)
nra=0;
else
{
cp=a;
cif=0;
while(cp)
{
cif++;
cp/=10;
}
if(a>=c && a<10)
nra=1;
else
nra=0;
for(i=cif; i>0; i--)
{
v[i]=a%10;
a/=10;
}
nra+=f(cif,kc,c);
for(i=1; i<=cif; i++)
v[i]=0;
}
if(b<=0)
nrb=0;
else
{
cp=b;
cif=0;
while(cp)
{
cif++;
cp/=10;
}
if(b>=c && b<10)
nrb=1;
else
nrb=0;
for(i=cif; i>0; i--)
{
v[i]=b%10;
b/=10;
}
nrb+=f(cif,kc,c);
for(i=1; i<=cif; i++)
v[i]=0;
}
double z;
int rez=nrb-nra;
if(kc==0) rez=dif;
z=(double)rez/dif;
printf("%.6lf\n",z);
return 0;
}