Cod sursa(job #12497)

Utilizator ProstuStefan-Alexandru Filip Prostu Data 4 februarie 2007 10:43:59
Problema Diviz Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <cstdio>
#include <cstring>

const int NMAX = 204;
const int NCIF = 10;
const int KMAX = 102;
const int MOD = 30103;

int N, K, A, B;
int V[NMAX];
int first[NMAX][NCIF];
int DP[2][NMAX][KMAX];
int cnt;

void read() {
	FILE *fin = fopen("diviz.in", "rt");
	char buf[NMAX];

	fscanf(fin, " %d %d %d ", &K, &A, &B);

	fgets(buf, 256, fin);

	for (N = 0; '0' <= buf[N] && buf[N] <= '9'; ++N)
		V[N] = buf[N] - '0';

	fclose(fin);
}

void prething() {
	int i, T[NCIF];

	memset(T, 0xff, sizeof(T));

	for (i = N - 1; i >= 0; --i) {
		memcpy(first[i], T, sizeof(T));
		T[V[i]] = i;
	}
}

void dinamica() {
	int i, j, k, t, t1, c;

	for (i = 0; i < N; ++i)
		if (V[i] != 0)
			++DP[1][i][ V[i] % K ];
	
	for (i = 1; i <= B; ++i) {
		t = i & 1; t1 = t ^ 1;

		memset(DP[t1], 0x00, sizeof(DP[t1]));

		for (j = 0; j < N; ++j) {

			for (k = 0; k < K; ++k) {
				DP[t][j][k] %= MOD;

				for (c = 0; c < NCIF; ++c)
					if (first[j][c] != -1)
						DP[t1][first[j][c]][(k * 10 + c) % K] += DP[t][j][k];
			}

			if (i >= A) {
				cnt += DP[t][j][0];
				if (cnt >= MOD) cnt -= MOD;
			}

		}

	}
}

void write() {
	FILE *fout = fopen("diviz.out", "wt");

	fprintf(fout, "%d\n", cnt);

	fclose(fout);
}

int main() {
	
	read();

	prething();

	dinamica();

	write();

	return 0;
}