Cod sursa(job #1549991)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 13 decembrie 2015 00:43:05
Problema Diviz Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 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 = '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-'0')%K] = 1;

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

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

            if (k != 0)
                D[l&1][i][k] = 0;
        }
        if (l >= A) {
            sol += D[l&1][i][0];

            if (sol >= MOD)
                sol -= MOD;
        }
        D[l&1][i][0] = 0;
    }}

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

    return 0;
}