Cod sursa(job #1023398)

Utilizator florin.elfusFlorin Elfus florin.elfus Data 6 noiembrie 2013 21:31:23
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <stdio.h>
#include <string.h>

const int mod = 30103;
int dp[2][222][111];
int next[10][222];
char x[222];

void add(int &X, int Y) {
    X += Y;
    if (X >= mod)
        X -= mod;
}

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

    int K, A, B;
    scanf("%d%d%d\n", &K, &A, &B);
    gets(x + 1);
    int N = strlen(x + 1);

    for (int i = N; i >= 1; --i) {
        for (int c = 0; c <= 9; ++c)
            next[c][i] = next[c][i + 1];
        next[x[i] - '0'][i] = i;
    }

    for (int c = 1; c <= 9; ++c)
        dp[1][next[c][1]][c % K] = 1;
    int res = 0;
    for (int len = 1; len <= B; ++len)  {
        for (int i = 1; i <= N; ++i)
            for (int r = 0; r < K; ++r)
                if (dp[len & 1][i][r]) {
                    for (int c = 0; c <= 9; ++c) {
                        int nextPos = next[c][i + 1];
                        int nextRem = (r * 10 + c) % K;
                        add(dp[(len + 1) & 1][nextPos][nextRem], dp[len & 1][i][r]);
                    }
                    if (r == 0 && len >= A)
                        add(res, dp[len & 1][i][r]);
                    dp[len & 1][i][r] = 0;
                }
    }

    printf("%d", res);
    return 0;
}