Cod sursa(job #594144)

Utilizator SpiderManSimoiu Robert SpiderMan Data 6 iunie 2011 13:44:40
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
# include <cstdio>
# include <cstring>

const char *FIN = "diviz.in", *FOU = "diviz.out" ;
const int MAX = 205, MOD = 30103;

char S[MAX] ;
int first[10][MAX], dp[2][MAX][105] ;
int A, B, K, sol ;

int main (void) {
    fscanf (fopen (FIN, "r"), "%d %d %d %s", &K, &A, &B, S + 1) ;
    int N = strlen (S + 1) ;
    for (int i = 1; i <= N; ++i) S[i] -= '0' ;
    for (int i = 0; i <= 9; ++i) {
        for (int j = N; j > 0; --j) {
            first[i][j] = (S[j] == i ? j : first[i][j + 1]) ;
        }
    }
    for (int i = 1; i <= 9; ++i)
        dp[0][ first[i][1] ][ i % K ] = 1 ;
    for (int i = 1; i < B; ++i) {
        for (int j = i; j <= N; ++j) {
            for (int k = 0; k < K; ++k) {
                if (dp[0][j][k]) {
                    for (int l = 0; l <= 9; ++l) {
                        dp[1][ first[l][j + 1] ][ (k * 10 + l) % K ] += dp[0][j][k],
                        dp[1][ first[l][j + 1] ][ (k * 10 + l) % K ] %= MOD ;
                    }
                }
            }
        }
        if (i >= A) {
            for (int j = i; j <= N; ++j) {
                sol += dp[0][j][0], sol %= MOD ;
            }
        }
        if (i == B - 1) {
            for (int j = i; j <= N; ++j) {
                sol += dp[1][j][0], sol %= MOD ;
            }
        }
        if (i < B - 1) {
            memcpy (dp[0], dp[1], sizeof (dp[1]));
            memset (dp[1], 0, sizeof (dp[1])) ;
        }
    }
    fprintf (fopen (FOU, "w"), "%d", sol) ;
}