Pagini recente » Cod sursa (job #1254396) | Cod sursa (job #1551371) | Cod sursa (job #1491092) | Cod sursa (job #1551424) | Cod sursa (job #1551395)
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <sys/time.h>
#define MAX_N 13
#define SMECHERIE 1000000
int dig, freq;
int D[MAX_N][MAX_N];
long long getTime() {
struct timeval tv;
gettimeofday( &tv, NULL );
return 1000000LL * tv.tv_sec + tv.tv_usec;
}
int memo( int N, int f ) {
if ( N < 0 ) {
return 0;
}
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 check( int X ) {
int d, f = 0;
do {
d = X / 10;
f += ( X - d * 10 == dig );
X = d;
} while ( (X > 0) && (freq != f) );
return f == freq;
}
int main(void) {
FILE *fin, *fout;
int A, B;
int numarator, numitor;
long long startTime;
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 ) {
numarator = numitor = 1;
} else {
if ( dig == 0 ) {
numitor = B - A + 1;
numarator = 0;
if ( numitor <= SMECHERIE ) {
for ( ; A <= B; A++ )
numarator += check( A );
} else {
numitor = 0;
srand(time(NULL));
startTime = getTime();
while ( getTime() - startTime < 95000 ) {
numarator += check( A + rand() % ( B - A + 1 ) );
numitor++;
}
}
} else {
numarator = DP(B+1) - DP(A);
numitor = B - A + 1;
}
fprintf( fout, "%lf\n", 1.00 * numarator / numitor );
}
fclose( fout );
return 0;
}