Cod sursa(job #16934)

Utilizator diaDiana Adrisor dia Data 14 februarie 2007 15:30:04
Problema Diviz Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 2.33 kb
#include <stdio.h>
#include <string.h>
#define NMAX 202
#define KMAX 102
#define CMAX 10
#define MOD 30103
#define INF 666000666

int D[2][NMAX][KMAX], N, A, B, K, First[CMAX][NMAX], V[NMAX], Rez, Cif[NMAX], Sf[CMAX][NMAX];
int rest[4310];

int mod(int s)
{
        return (s>=MOD ? (s-MOD):s);
}

int main()
{
        int i, j, r, cif, s = 0, d = 1, t;
        char c[NMAX];
        
        freopen("diviz.in", "r", stdin);
        scanf("%d %d %d ", &K, &A, &B);

        gets(c);
        N = strlen(c);

        for (i = 0; i < N; i++)
        {
                V[1+i] = c[i]-48;
                Cif[V[i]] = 1;
                First[V[i]][1] = i;
                Sf[V[i]][1] = i;
        }

        for (i = 0; i < 4300; i++) rest[i] = i%K;

        for (cif = 0; cif < CMAX; cif++)
            for (i = 1; i <= N; i++)
                for (j = i+1; j <= N; j++)
                    if (V[i] == V[j]) { First[ V[i] ][i] = j; break; }

        for (cif = 0; cif < CMAX; cif++)
        {
            i = N;
            while (First[cif][i] == 0) i--;
            First[cif][i+1] = INF;
        }


        for (cif = 1; cif < CMAX; cif++)
            if (Cif[cif]) D[0][ First[cif][1] ][ cif%K ] = 1;

        for (cif = 0; cif < CMAX; cif++)
            for (i = 2; i <= N; i++)
            {
                First[cif][i] = (First[cif][i] == 0 ? First[cif][i-1]:First[cif][i]);
                Sf[cif][i] = ((First[cif][i] < INF) ? (First[cif][i]+Sf[cif][i-1]) : INF);
            }

        if (A == 1)
           for (j = 1; j <= N; j++) Rez += D[0][j][0];

        for (i = 2; i <= B; i++)
        {
            for (j = 1; j <= N; j++)
            {
                for (r = 0; r < K; r++)
                    for (cif = 0; cif < CMAX; cif++)
                       if (Cif[cif] && First[cif][j] < INF && (Sf[cif][ First[cif][j] ]-Sf[cif][j] == 0))
                       {
                           t = (r*10+cif);
                           D[d][ First[cif][j] ][ rest[t] ] = mod(D[d][ First[cif][j] ][ rest[t] ]+D[s][j][r]);
                       }
                Rez = (i>=A)*mod(Rez+D[d][j][0]);
            }
            s = (s+1)&1; d = (d+1)&1;
        }

        freopen("diviz.out", "w", stdout);
        printf("%d\n", Rez);
                    
        return 0;
        
}