Pagini recente » Cod sursa (job #101185) | Cod sursa (job #3239516) | Cod sursa (job #603688) | Cod sursa (job #3272455) | Cod sursa (job #2200358)
#include <bits/stdc++.h>
using namespace std;
ifstream in("cifre.in");
ofstream out("cifre.out");
const int NMAX = 1e9;
int K, C;
int comb[20][20], fac[20];
void precalc()
{
comb[0][0] = 1;
for( int i = 1; i <= 18; ++i ) {
comb[i][0] = 1;
for( int j = 1; j <= 18; ++j )
comb[i][j] = comb[i - 1][j] + comb[i - 1][j - 1];
}
}
int formula(int nr, int fix)
{
int coef = comb[nr][fix];
for( int i = 1; i <= nr - fix; ++i )
coef = coef * 9;
return coef;
}
int solve(int val)
{
if( val < 0 )
return 0;
if( val == 0 )
return (C == 0) && (K <= 1);
int v[12];
int ind = 0;
while( val ) {
v[++ind] = val % 10;
val /= 10;
}
int ans = 0;
reverse(v+1, v+ind+1);
for( int pre = 0, nrc = 0; pre <= ind; ++pre ) {
if( pre == ind ) {
ans += (nrc >= K);
break;
}
for( int c = v[pre + 1] - 1; c >= 0; --c ) {
int cifre = nrc + (c == C);
int liber = ind - pre - 1;
for( int more = 0; more <= liber; ++more ) {
if( cifre + more >= K ) {
ans += formula(liber, more);
}
}
}
nrc += (v[pre + 1] == C);
}
return ans;
}
int main()
{
precalc();
int A, B;
in >> A >> B >> C >> K;
out << fixed << setprecision(4) << (solve(B) - solve(A - 1)) * 1.0 / (B - A + 1) << '\n';
return 0;
}