Cod sursa(job #2698182)

Utilizator LucaMihaiLM10Luca Ilie LucaMihaiLM10 Data 21 ianuarie 2021 11:57:25
Problema Cifre Scor 80
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#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;
}