Pagini recente » Cod sursa (job #537753) | Cod sursa (job #665996) | Cod sursa (job #2356526) | Cod sursa (job #3217950) | Cod sursa (job #2698182)
#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, z, i;
ncif = 0;
ras = 0;
while ( n > 0 ) {
ras = ras * 10 + n % 10;
ncif++;
n /= 10;
}
n = ras;
rez = 0;
z = 0;
if ( c == 0 ) {
for ( i = ncif - 1; i >= 1; i-- )
rez += 9 * dp[i - 1][k];
z = 1;
}
for ( i = ncif; i >= 1; i-- ) {
if ( n % 10 > c && k > 0 && c > 0 ) {
rez += dp[i - 1][k - 1];
n--;
}
rez += (n % 10 - z) * dp[i - 1][k];
if ( n % 10 == c )
k = k > 0 ? k - 1 : 0;
n /= 10;
z = 0;
}
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;
}