Cod sursa(job #219227)

Utilizator marius.pungaruMarius Pungaru marius.pungaru Data 6 noiembrie 2008 01:44:25
Problema Diviz Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <stdio.h>
#include <string.h>

#define MAX_N 256
#define MAX_K 128
#define MOD 30103

int K, A, B, L, C[2][MAX_N][MAX_K], S[MAX_N][10], N[MAX_N];

void process(void)
{
    int i, T[10];

    memset(T, 0xff, sizeof(T));
    for (i = L - 1; i >= 0; i--)
    {
        memcpy(S[i], T, sizeof(int) * 10);
        T[N[i]] = i;
    }
}

int main(void)
{
    int i, j, k, d, sols = 0, past = 0, present = 1;
    char str[MAX_N];

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

    scanf("%d %d %d\n", &K, &A, &B);
    scanf("%s", str), L = strlen(str);
    for (i = 0; i < L; i++)
        N[i] = str[i] - '0';;

    process();

    for (i = 1; i < 10; i++)
        if (S[0][i] >= 0 && i != N[0])
            C[past][S[0][i]][i % K] = 1;
    C[past][0][N[0] % K] = 1;

    for (j = 1; j <= L; j++, past ^= 1, present ^= 1)
    {
        memset(C[present], 0, sizeof(C[present]));

        for (i = 0; i < L; i++)
            for (k = 0; k < K; k++)
            {
                if (!C[past][i][k])
                    continue;
                if (A <= j && j <= B && k == 0)
                    sols = (sols + C[past][i][k]) % MOD;
                for (d = 0; d < 10; d++)
                    if (S[i][d] > 0)
                        C[present][S[i][d]][(k * 10 + d) % K] =
                        (C[present][S[i][d]][(k * 10 + d) % K] + 
                        C[past][i][k]) % MOD;
            }

    }

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

    return 0;
}