Cod sursa(job #2717659)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 7 martie 2021 19:23:52
Problema Cifre Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#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;
}