Cod sursa(job #2698109)

Utilizator LucaMihaiLM10Luca Ilie LucaMihaiLM10 Data 20 ianuarie 2021 23:01:32
Problema Cifre Scor 30
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.47 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, 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];
    }

    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;
}