Cod sursa(job #1550000)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 13 decembrie 2015 00:59:54
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <cstdio>
#include <cstring>

#define DIM 256
#define MOD 30103
using namespace std;

int N, K, A, B, sol; char S[DIM];
int D[2][DIM][DIM/2], Next[DIM][DIM];

int main () {

    freopen ("diviz.in" ,"r", stdin );
    freopen ("diviz.out","w", stdout);

    scanf ("%d %d %d", &K, &A, &B);
    scanf ("%s", S + 1); 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 >= 1; j --) {
            if (S[j] == i)
                Next[i][j] = j;
            else
                Next[i][j] = Next[i][j+1];
        }
    }

    for (int c = 1; c <= 9; c ++)
        D[1][Next[c][1]][c%K] = 1;

    for (int l = 1; l <= B; l ++) {
        memset (D[(l+1)&1], 0, sizeof(D[(l+1)&1]));

        for (int i = l; i <= N; i ++) {
            for (int k = 0; k  < K; k ++) {

                if (D[l&1][i][k] == 0)
                    continue;

                for (int c = 0; c <= 9; c ++) {
                    if (Next[c][i+1] != 0) {
                        D[(l+1)&1][Next[c][i+1]][(k*10+c)%K] += D[l&1][i][k];

                        if (D[(l+1)&1][Next[c][i+1]][(k*10+c)%K] >= MOD)
                            D[(l+1)&1][Next[c][i+1]][(k*10+c)%K] -= MOD;
                    }
                }
            }
            if (l >= A) {
                sol += D[l&1][i][0];

                if (sol >= MOD)
                    sol -= MOD;
            }
        }
    }

    printf ("%d\n", sol);

    return 0;
}