Cod sursa(job #20493)

Utilizator love_for_uSpancioc Riana love_for_u Data 21 februarie 2007 17:02:28
Problema Diviz Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <stdio.h>
#include <string.h>
#define MOD 30103
#define NMAX 205
#define KMAX 105
#define CMAX 11

int A[NMAX][NMAX][KMAX];
int Viz[CMAX], First[CMAX][NMAX];
char S[NMAX];
int N, K, L, U, i, j, cif, r;
int Sol;

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

     scanf("%d %d %d\n", &K, &L, &U);

     gets(S+1);
     N = strlen(S+1);

     for (i = 1; i <= N; i++) Viz[S[i] - '0'] = 1;

     for (cif = 0; cif <= 9; cif++)
         for (i = 1; i <= N && Viz[cif]; i++)
         {
             for (j = i; j <= N; j++)
                 if (S[j] - '0' == cif) break;

             if (j <= N) First[cif][i] = j;
         }

     for (cif = 0; cif <= 9; cif++)
         if (Viz[cif]) A[1][First[cif][1]][cif % K] = 1;

     for (j = 1; j <= N; j++)
         for (i = 1; i <= N; i++)
             for (r = 0; r < K; r++)
             {
                    for (cif = 0; cif <= 9; cif++)
                       if (Viz[cif])
                       {
                          int cf = First[cif][i + 1];
                          int rn = ((r * 10) + cif) % K;

                          A[j + 1][cf][rn] = (A[j + 1][cf][rn] + A[j][i][r]) % MOD;
                       }

                    if (j >= L && j <= U && r == 0) Sol = (Sol + A[j][i][0]) % MOD;
             }

     printf("%d\n", Sol % MOD);

     return 0;
}