Pagini recente » Cod sursa (job #3280194) | Cod sursa (job #3283275) | Cod sursa (job #2698163)
#include <stdio.h>
#define MAX_NCIF 9
#define MAX_K 9
#define MAX_N 1000000000
int dp[MAX_NCIF + 1][MAX_K + 1], cif[MAX_NCIF];
int cifre( int n, int c, int k ) {
int rez, ncif, ras, i;
if ( n == MAX_N ) {
rez = dp[MAX_NCIF][k];
if ( c == 0 )
rez++;
if ( c == 1 && k == 1 )
rez++;
} else {
ncif = 0;
ras = 0;
while ( n > 0 ) {
ras = ras * 10 + n % 10;
ncif++;
n /= 10;
}
n = ras;
rez = 0;
for ( i = ncif; i >= 1; i-- ) {
if ( n % 10 > c && k > 0 ) {
rez += dp[i - 1][k - 1];
n--;
}
rez += (n % 10) * dp[i - 1][k];
if ( n % 10 == c )
k = k > 0 ? k - 1 : 0;
n /= 10;
}
if ( k == 0 )
rez++;
}
return rez;
}
int main() {
FILE *fin, *fout;
int a, b, c, k, i, j;
fin = fopen( "cifre.in", "r" );
fscanf( fin, "%d%d%d%d", &a, &b, &c, &k );
fclose( fin );
dp[0][0] = 1;
for ( i = 1; i <= MAX_NCIF; i++ ) {
dp[i][0] = 9 * dp[i - 1][0];
for ( j = 1; j <= MAX_K; j++ )
dp[i][j] = 9 * dp[i - 1][j] + dp[i - 1][j - 1];
}
for ( i = 1; i <= MAX_NCIF; i++ )
for ( j = MAX_K - 1; j >= 0; j-- )
dp[i][j] += dp[i][j + 1];
fout = fopen( "cifre.out", "w" );
fprintf( fout, "%.4f", ((double)cifre( b, c, k ) - cifre( a - 1, c, k )) / (b - a + 1) );
fclose( fout );
return 0;
}