Pagini recente » Cod sursa (job #99154) | Cod sursa (job #299889) | Cod sursa (job #1679119) | Cod sursa (job #1039983) | Cod sursa (job #22806)
Cod sursa(job #22806)
#include<stdio.h>
long aa,bb,A,v[12][12],vv[12][12];
int a[12],b[12],nr,na,nb,c,n;
void READ()
{
FILE *f;
f=fopen("cifre.in","r");
fscanf(f,"%ld %ld %d %d",&aa,&bb,&nr,&c);
A=bb-aa+1;
while(aa) { na++; a[na]=aa%10; aa/=10; }
bb++;
while(bb) { nb++; b[nb]=bb%10; bb/=10; }
fclose(f);
}
void BUILD()
{ int i,j;
v[0][0]=1;
v[1][1]=1;
v[1][0]=9;
for(i=2;i<=nb;i++)
for(j=0;j<=i;j++)
v[i][j]=9*v[i-1][j]+(j==0?0:v[i-1][j-1]);
if(c==0) vv[1][0]=9;
else vv[1][0]=8,vv[1][1]=1;
for(i=2;i<=nb;i++)
for(j=0;j<=i;j++)
if(c==0) vv[i][j]=vv[i-1][j]+9*v[i-1][j];
else vv[i][j]=vv[i-1][j]+8*v[i-1][j]+v[i-1][j-1];
}
long solve(int *x)
{ int i,j,k;
long sol=0;
for(i=nr;i<=n;i++)
sol+=vv[n-1][i];
for(i=1;i<x[n];i++)
for(j=nr;j<=n;j++)
if(i==c){ if(j>0) sol+=v[n-1][j-1]; }
else sol+=v[n-1][j];
if(x[n]==c && nr>0) nr--;
for(i=n-1;i>=1;i--){
for(j=0;j<x[i];j++)
for(k=nr;k<=n;k++)
if(j==c){ if(k>0) sol+=v[i-1][k-1];}
else sol+=v[i-1][k];
if(x[i]==c && nr>0) nr--;
}
return sol;
}
int main()
{
READ();
BUILD();
long sol;
n=nb;
sol=solve(b);
n=na;
sol-=solve(a);
if(a==0 && c==0) sol+=1;
FILE *g;
g=fopen("cifre.out","w");
fprintf(g,"%.4f",(float)sol/A);
fclose(g);
return 0;
}