Pagini recente » Cod sursa (job #3041071) | Cod sursa (job #3247940) | Cod sursa (job #76667) | Cod sursa (job #108900) | Cod sursa (job #8157)
Cod sursa(job #8157)
#include <cstdio>
#include <memory>
#include <cstring>
using namespace std;
const char iname[] = "diviz.in;
const char oname[] = "diviz.out";
#define MAX_N 200
#define MAX_K 100
#define modulo 30103
char X[MAX_N];
int first[10][MAX_N];
int cnt[2][MAX_N][MAX_K];
int Res;
int main(void) {
freopen(iname, "r", stdin);
int L;
int K, A, B;
scanf("%d %d %d\n", & K, & A, & B);
scanf("%s\n", X);
L = int(strlen(X));
for (int c = 0; c < 10; ++c) {
first[c][L] = L;
for (int i = L; i--; ) {
if (X[i] - '0' == c)
first[c][i] = i;
else
first[c][i] = first[c][i + 1];
}
}
int stp = 0;
for (int c = 0; c < 10; ++c) {
for (int i = 0; i < L; ++i)
if (X[i] - '0' == c) {
cnt[stp][i][c % K] = 1;
break ;
}
}
for (int j = stp = 1; j < L; ++j) {
memset(cnt[stp], 0, sizeof(cnt[stp]));
for (int i = j - 1; i < L; ++i) {
for (int r = 0; r < K; ++r)
for (int c = 0; c < 10; ++c) {
int sum = cnt[stp][first[c][i + 1]][(r * 10 + c) % K];
cnt[stp][first[c][i + 1]][(r * 10 + c) % K] = (sum + cnt[1 ^ stp][i][r]) % modulo;
}
if ((A <= j) && (j <= B))
Res = (Res + cnt[1 ^ stp][i][0]) % modulo;
}
stp ^= 1;
}
if (B == L) {
for (int i = 0; i < L; ++i)
Res = (Res + cnt[1 ^ stp][i][0]) % modulo;
}
freopen(oname, "w", stdout);
printf("%d\n", Res);
return 0;
}