Pagini recente » Cod sursa (job #930500) | Cod sursa (job #51164) | Cod sursa (job #850019) | Cod sursa (job #159198) | Cod sursa (job #9269)
Cod sursa(job #9269)
#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 && (first[j][T[j]] == -1 || first[j][T[j]] <= first[j][p])) {
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;
}