Cod sursa(job #1549993)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 13 decembrie 2015 00:49:42
Problema Diviz Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 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 ++) {
    for (int i = l; i <= N; i ++) {

        if (l != B) {
            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)%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 (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;
}