Pagini recente » Cod sursa (job #5311) | Cod sursa (job #508600) | Cod sursa (job #1673831) | Cod sursa (job #3039216) | Cod sursa (job #12497)
Cod sursa(job #12497)
#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;
}