Cod sursa(job #12339)

Utilizator dominoMircea Pasoi domino Data 3 februarie 2007 16:37:41
Problema Diviz Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <stdio.h>
#include <string.h>

#define MAX_N 105
#define MAX_K 105
#define FIN "diviz.in"
#define FOUT "diviz.out"
#define FOR(i, a, b) for (i = (a); i < (b); i++)
#define MOD 30103

int K, A, B, pos[MAX_N][10]; char N[256];
unsigned X[MAX_N][MAX_K], Y[MAX_N][MAX_K], Res;

inline void add(unsigned &a, unsigned &b)
{
    a += b;
    while (a >= MOD) a -= MOD;
}

int main(void)
{
    int i, j, k, c, n;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    scanf("%d %d %d", &K, &A, &B);
    scanf("%s", N);
    n = strlen(N);

    for (i = 0; i < 10; i++) pos[n+1][i] = n+1;
    for (i = n; i >= 0; i--)
        for (j = 0; j < 10; j++)
            pos[i][j] = i > 0 && N[i-1] == j+'0' ? i : pos[i+1][j];


    X[0][0] = 1;
    FOR (i, 1, B+1) 
    {
        FOR (j, 0, n) FOR (k, 0, K)
        {
            if (!X[j][k]) continue;
            FOR (c, 0, 10)
            {
                if (i == 1 && !c) continue;
                add(Y[pos[j+1][c]][(k*10+c)%K], X[j][k]);
            }
        }
        memcpy(X, Y, sizeof(Y));
        memset(Y, 0, sizeof(Y));
        if (i < A) continue;
        FOR (j, 0, n+1) add(Res, X[j][0]);
    }

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

    return 0;
}