Pagini recente » Cod sursa (job #1621483) | Cod sursa (job #2313290) | Cod sursa (job #655026) | Cod sursa (job #667183) | Cod sursa (job #767346)
Cod sursa(job #767346)
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int p,l1,a1,b1,c,k,nr1,i,j,l,v[15],a[14][14];
void fac(int val)
{
l=0;
while(val>0)
{
l++;
v[l]=val%10;
val=val/10;
}
reverse(v+1,v+l+1);
}
int nr(int l,int v[12])
{
int nr1=0;
if(l==0) return 0;
memset(a,0,sizeof(a));
for(p=1;p<v[1];p++)
{
if(p==c) a[1][1]=1;
else a[1][0]++;
}
if(v[1]==c)
nr1=1;
for(i=2;i<=l;i++)
{
for(j=0;j<=i;j++)
{
if(j==nr1)
{
a[i][j]=v[i];
if(v[i]>=c) a[i][j]--;
}
if(j==nr1+1&&c<v[i])
a[i][j]=1;
for(p=0;p<=9;p++)
{
if(p==c&&j>0) a[i][j]=a[i][j]+a[i-1][j-1];
else
if(p!=c) a[i][j]=a[i][j]+a[i-1][j];
}
}
if(v[i]==c) nr1++;
}
if(nr1>=k) nr1=1;
for(j=k;j<=l;j++)
nr1=nr1+a[l][j];
//mai adun cate numere care au cel putin k cifre de c <10^(l-1)
memset(a,0,sizeof(a));
if(c!=0)
{
a[1][1]=1;
a[1][0]=8;
}
else a[1][0]=9;
for(i=2;i<l;i++)
{
a[i][0]=a[i-1][0]*9;
for(j=1;j<=i;j++)
a[i][j]=a[i-1][j]*9+a[i-1][j-1];
}
for(i=1;i<l;i++)
for(j=k;j<=i;j++)
nr1=nr1+a[i][j];
return nr1;
}
int main()
{
freopen("cifre.in","r",stdin);
freopen("cifre.out","w",stdout);
scanf("%d %d %d %d",&a1,&b1,&c,&k);
if(k==0) printf("1.00000\n");
fac(b1);
l1=nr(l,v);
if(a1>0)
{
fac(a1-1);
l1=l1-nr(l,v);
}
else if(c==0) l1++;
printf("%d\n",l1);
printf("%.4lf\n",(double)l1/(b1-a1+1));
return 0;
}