Pagini recente » Cod sursa (job #954218) | Cod sursa (job #2055605) | Cod sursa (job #2575491) | Cod sursa (job #1606989) | Cod sursa (job #8154)
Cod sursa(job #8154)
#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
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)
cnt[stp][first[c][i + 1]][(r * 10 + c) % K] += cnt[1 ^ stp][i][r];
if ((A <= j) && (j <= B))
Res += cnt[1 ^ stp][i][0];
}
stp ^= 1;
}
if (B == L) {
for (int i = 0; i < L; ++i)
Res += cnt[1 ^ stp][i][0];
}
freopen(oname, "w", stdout);
printf("%d\n", Res);
return 0;
}