Pagini recente » Cod sursa (job #837909) | Cod sursa (job #1438155) | Cod sursa (job #1111488) | Cod sursa (job #681549) | Cod sursa (job #2717659)
#include <stdio.h>
#define MAX 10
int dp[ MAX + 1 ][ MAX + 1 ];
int v[ 15 ];
int a, b, c, k;
int calcul( int n, int k ){
int nr = n, dis = 0;
int overthrow = 0;
while( nr ){
dis++;
overthrow = overthrow * 10 + nr % 10;
nr /= 10;
}
int rez = 0, z = 0;
int no = overthrow;
if( c == 0 ){
for( int i = dis - 1; i >= 1; --i )
rez += 9 * dp[ i - 1 ][ k ];
z = 1;
}
for( int i = dis; i >= 1; --i ){
if( no % 10 > c && k > 0 && z == 0 ){
rez += dp[ i - 1 ][ k - 1 ];
--no;
}
rez += ( no % 10 - z ) * dp[ i - 1 ][ k ];
if( no % 10 == c )
k = ( k > 0 ? k - 1 : 0 );
no /= 10;
z = 0;
}
if( k == 0 )
++rez;
return rez;
}
void pre_calcul(){
dp[ 0 ][ 0 ] = 1;
for( int dis = 1; dis <= 9; ++dis ){
dp[ dis ][ 0 ] = dp[ dis - 1 ][ 0 ] * 9;
for( int cif = 1; cif <= 9; ++cif )
dp[ dis ][ cif ] = dp[ dis - 1 ][ cif ] * 9 + dp[ dis - 1 ][ cif - 1 ];
}
for( int dis = 1; dis <= 9; ++dis )
for( int cif = 8; cif >= 0; --cif )
dp[ dis ][ cif ] += dp[ dis ][ cif + 1 ];
}
int main()
{
FILE *fin = fopen( "cifre.in", "r" );
fscanf( fin, "%d %d %d %d", &a, &b, &c, &k );
fclose( fin );
pre_calcul();
int nr = calcul( b, k );
nr -= calcul( a - 1, k );
FILE *fout = fopen( "cifre.out", "w" );
fprintf( fout, "%.4f", (double)nr / (double)( b - a + 1 ) );
fclose( fout );
return 0;
}