Pagini recente » Borderou de evaluare (job #2028512) | Borderou de evaluare (job #415411) | Borderou de evaluare (job #2024253) | Borderou de evaluare (job #358712) | Cod sursa (job #1465578)
#include <cstdio>
using namespace std;
int d[15][15];
int a[15];
int c;
int sum_up(int nr, int k)
{
int n = 0;
do
{
a[n++] = nr%10;
nr/=10;
}
while(nr);
int nrc = 0;
for(int i=0; i<n; i++)
if(a[i] == c)
nrc++;
int sum = 0;
if(nrc >= k)sum = 1;
for(int i=n-1; i>=0; i--)
{
///formula : sum += a[i]*d[i][>=k] + (a[i]-1>=c ? d[i-1][>=k-1] : 0)
for(int j=k; j<=i; j++)
sum += a[i]*d[i][j];
if(a[i]-1 >= c)
for(int j=k-1; j<=i-1; j++)
sum += d[i-1][j];
if(a[i] == c)k--;
}
return sum;
}
int main()
{
freopen("cifre.in", "r", stdin);
freopen("cifre.out", "w", stdout);
int a, b, k;
scanf("%d%d%d%d", &a, &b, &c, &k);
if(c == 0)d[0][1] = 1;
else d[0][0] = 1;
for(int i=1; i<10; i++)
for(int j=0; j<=i; j++)
{
if(c)d[i][j] = 9 * d[i-1][j] + d[i-1][j-1];
else d[i][j] = 9 * d[i-1][j] + d[i-1][j-1];
}
int ans = sum_up(b, k)-sum_up(a-1, k);
printf("%lf", 1.0*ans/(b-a+1));
return 0;
}