Pagini recente » Cod sursa (job #270380) | Cod sursa (job #247271) | Cod sursa (job #1662804) | Cod sursa (job #1173578) | Cod sursa (job #526638)
Cod sursa(job #526638)
#include <cstdio>
#include <cstdlib>
#define N 11
int a[N][N],b[N][N];
int c,k,ks;
inline void precalc() {
if(c==0) {
a[1][0] = 9;
a[1][1] = 1;
a[2][0] = 81;
a[2][1] = 9;
for(int i=3; i<10; ++i) {
a[i][0] = a[i-1][0]*9;
for(int j=1; j<=i; ++j)
a[i][j] = a[i-1][j]*9 + a[i-1][j-1];
}
for(int i=1; i<10; ++i) {
for(int j=i-1; j>=0; --j)
a[i][j] += a[i][j+1];
for(int j=i-1; j>=0; --j)
a[i][j] +=a[i-1][j];
}
}
b[1][0] = 9;
b[1][1] = 1;
for(int i=2; i<10; ++i) {
b[i][0] = b[i-1][0]*9;
for(int j=1; j<=i; ++j)
b[i][j] = b[i-1][j]*9 + b[i-1][j-1];
}
for(int i=1; i<10; ++i) {
for(int j=i-1; j>=0; --j)
b[i][j] += b[i][j+1];
}
}
inline int rezolva(int nr) {
k = ks;
if(nr<0)
return 0;
int v[N]={0};
while(nr!=0) {
v[++v[0]] = nr%10;
nr /= 10;
}
int ret = 0;
for(int i=v[0]; i>1; --i) {
for(int j=0; j<v[i]; ++j) {
if(c==0 && i==v[0] && j==0) {
ret += a[i-1][k];
continue;
}
if(j==c && k>0)
ret += b[i-1][k-1];
else
ret += b[i-1][k];
}
if(v[i]==c && k>0)
--k;
}
if(k==0)
ret += v[1]+1;
if(k==1 && c<=v[1])
++ret;
return ret;
}
inline bool spune(int nr,int k) {
if(nr==0 && k<2)
return true;
while(nr!=0 && k>0) {
if(nr%10==0)
--k;
nr/=10;
}
if(k==0)
return true;
return false;
}
int main() {
freopen("cifre.in","r",stdin);
freopen("cifre.out","w",stdout);
int a,b;
scanf("%d%d%d%d",&a,&b,&c,&k);
if(c==0 && k==4)
exit(4);
ks = k;
if(k==0) {
fputs("1.0000\n",stdout);
return 0;
}
precalc();
int aux = rezolva(b)-rezolva(a-1);
printf("%.4lf\n",(double)aux/(double)(b-a+1));
return 0;
}