Pagini recente » Cod sursa (job #153255) | Cod sursa (job #2674557) | Cod sursa (job #1286437) | Cod sursa (job #1033244) | Cod sursa (job #2200364)
#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;
assert(0 <= coef && coef <= 1e9);
return coef;
}
int formula_2(int nr, int fix)
{
int ans = 0;
for( int c = 1; c <= 9; ++c ) {
int liber = nr - 1;
if( fix - (c == K) < 0 ) continue;
if( nr - 1 == 0 )
ans += 1;
else if( nr - 1 < 0 )
ans += 0;
else
ans += formula(nr - 1, fix - (c == K));
}
return ans;
}
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 cifre = 1; cifre < ind; ++cifre ) {
if( cifre == 1 && C == 0 ) {
ans += (K <= 1);
}
for( int start = 1; start <= 9; ++start ) {
int nrc = (start == K);
for( int more = 0; more <= cifre - 1; ++more ) {
if( nrc + more >= K )
ans += formula(cifre - 1, more);
}
}
}
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 ) {
if( c == 0 && pre == 0 ) continue;
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;
}