Cod sursa(job #8392)

Utilizator unholyfrozenCostea Andrei unholyfrozen Data 24 ianuarie 2007 18:35:20
Problema Diviz Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include<stdio.h>
#include<string.h>

#define NMAX 201
#define KMAX 101
#define Q 30103

void read();
void solve();

int  K, A, B, N, V[NMAX][KMAX], next[NMAX][10];
char S[NMAX];

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

     read();
     solve();
	return 0;
}

void read()
{
	scanf("%d%d%d", &K, &A, &B);
     scanf("%s", S);
     N = strlen(S);
}

void solve()
{
	int i, j, k, rez = 0, c;

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

     for(i = 0; i < N; i++)
     for(k = 0; k < 10; k++)
     for(j = i; j < N; j++)
     if(S[j] == k + '0')
     {
     next[i][k] = j;
     break;
     }

     for(j = 1; j < B; j++)
     for(i = N - 1; i >= 0; i--)
     for(k = 0; k < K; k++)
     {
     	if(!V[i][k]) continue;
     	if(j >= A && !k)
          rez += V[i][k], rez %= Q;
          for(c = 0; c < 10; c++)
          if(next[i + 1][c])
          V[next[i + 1][c]][(k * 10 + c)%K] += V[i][k], V[next[i + 1][c]][(k * 10 + c)%K] %= Q;
		V[i][k] = 0;
     }
     for(i = N - 1; i >= 0; i--)
     rez += V[i][0], rez %= Q;
     printf("%d\n", rez);
}