Pagini recente » Cod sursa (job #194414) | Cod sursa (job #1696095) | Cod sursa (job #672456) | Cod sursa (job #1030640) | Cod sursa (job #1551369)
#include <stdio.h>
#include <string.h>
#include <assert.h>
#define MAX_N 14
#define SMECHERIE 10000000
int dig, freq;
int D[MAX_N][MAX_N];
int memo( int N, int f ) {
if ( D[N][f] != -1 ) {
return D[N][f];
}
if ( N == 0 ) {
return D[N][f] = ( f >= freq );
}
int i, q;
q = 0;
for ( i = 0; i < 10; i++ ) {
q += memo( N - 1, f + ( dig == i ) );
}
D[N][f] = q;
return q;
}
int DP( int X ) {
char buf[MAX_N];
int N, i, j, currDig, q, fr;
for ( i = 0; i < MAX_N; i++ )
for ( j = 0; j < MAX_N; j++ )
D[i][j] = -1;
sprintf( buf, "%d", X );
N = strlen( buf );
q = fr = 0;
for ( i = 0; i < N; i++ ) {
currDig = buf[i] - '0';
for ( j = 0; j < currDig; j++ )
q += memo( N - i - 1, fr + ( dig == j ) );
fr += ( currDig == dig );
}
return q;
}
int main(void) {
FILE *fin, *fout;
int A, B, i, j, tmp, t;
int numarator;
fin = fopen( "cifre.in", "r" );
fscanf( fin, "%d%d%d%d", &A, &B, &dig, &freq );
fclose( fin );
fout = fopen( "cifre.out", "w" );
if ( freq == 0 ) {
fputs( "1\n", fout );
} else {
if ( B - A + 1 <= SMECHERIE ) {
numarator = 0;
for ( t = A; t <= B; t++ ) {
tmp = t;
i = tmp / 10;
j = 0;
do {
j += ( tmp - ( i << 1 ) - ( i << 3 ) == dig );
tmp = i;
i = tmp / 10;
} while ( (tmp > 0) && (j != freq) );
numarator += ( j == freq );
}
} else {
numarator = DP(B+1) - DP(A);
}
fprintf( fout, "%lf\n", 1.00 * numarator / (B-A+1) );
}
fclose( fout );
return 0;
}