Cod sursa(job #9266)

Utilizator ProstuStefan-Alexandru Filip Prostu Data 27 ianuarie 2007 12:57:39
Problema Diviz Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <cstdio>
#include <cstring>

const int NCIF = 10;
const int NMAX = 128;
const int VMAX = 1024;
const int MOD = 30103;

int K, A, B, N;
int T[NMAX];
int first[NMAX][NCIF], M[VMAX];
int DP[2][NMAX][NMAX], cnt;
bool E[NMAX][NMAX];

void read() {
	FILE *fin = fopen("diviz.in", "rt");
	char buf[NMAX];
	
	fscanf(fin, " %d %d %d ", &K, &A, &B);

	fgets(buf, 128, fin);

	for (N = 0; buf[N] && buf[N] != '\n'; ++N)
		T[N] = buf[N] - '0';

	fclose(fin);
}

void process() {
	int i, j;
	int V[NCIF];

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

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

	for (i = 0, j = 0; i < VMAX; ++i, ++j) {
		if (j == K) j = 0;
		M[i] = j;
	}
		
}

void dinamica() {
	int i, j, k, t, t1, p, *f;

	for (j = 0; j < N; ++j)
		if (T[j] != 0)
			++DP[0][j][ M[T[j]] ];

	for (i = 0; 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) 
				for (p = 0; p < NCIF; ++p) 
					if (first[j][p] != -1) {
						f = &DP[t1][first[j][p]][M[(k * 10) + p]];
						*f += DP[t][j][k];
						if (*f >= MOD) *f -= MOD;
					}

			if (i + 1 >= 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();

	process();

	dinamica();

	write();

	return 0;
}