Pagini recente » Cod sursa (job #1333689) | Cod sursa (job #1181725) | Cod sursa (job #1093964) | Cod sursa (job #666370) | Cod sursa (job #2211063)
#include <bits/stdc++.h>
using namespace std;
int a, b, c, k;
inline int lgput(int x, int p){
int ans = 1, aux = x;
for(int i = 0; (1 << i) <= p ; ++i){
if((1 << i) & p) ans *= aux;
aux *= aux;
}
return ans;
}
inline int comb(int n, int k){
int ans = 1;
for(int i = 2; i <= n ; ++i)
ans *= n;
for(int i = 2; i <= k ; ++i)
ans /= i;
for(int i = 2; i <= n - k ; ++i)
ans /= i;
return ans;
}
inline int solve(int x, int c, int k){
int nrc = 0, aux = x, a[11];
while(aux > 0) a[++nrc] = aux % 10, aux /= 10;
if(x == 0 && c == 0 && k == 1) return 1;
if(k > nrc) return 0;
int ans = 0;
for(int i = k; i < nrc ; ++i){
int aux = comb(i - 1, k - 1);
ans = ans + aux * lgput(10, i - k);
if(i > k){
aux = comb(i, k);
ans = ans + aux * 9 * lgput(10, i - k - 1);
}
}
for(int i = 1; i <= nrc / 2 ; ++i)
swap(a[i], a[nrc - i + 1]);
for(int i = 1; i <= nrc ; ++i){
int cr = nrc - i;
for(int j = (i == 1); j < a[i] ; ++j){
int k2 = k - (j == c);
if(k2 < 0) ++k2;
if(k2 > cr) continue ;
int aux = comb(cr, k2);
ans = ans + aux * lgput(10, cr - k2);
}
if(a[i] == c && k > 0) --k;
}
if(k == 0) ++ans;
return ans;
}
int main()
{
freopen("cifre.in", "r", stdin);
freopen("cifre.out", "w", stdout);
scanf("%d%d%d%d", &a, &b, &c, &k);
int nr = solve(b, c, k) - solve(a - 1, c, k);
double sol = (double)nr / (double)(b - a + 1);
printf("%f", sol);
return 0;
}