Pagini recente » Cod sursa (job #1015069) | Cod sursa (job #1575333) | Cod sursa (job #828370) | Cod sursa (job #2175284) | Cod sursa (job #1023398)
#include <stdio.h>
#include <string.h>
const int mod = 30103;
int dp[2][222][111];
int next[10][222];
char x[222];
void add(int &X, int Y) {
X += Y;
if (X >= mod)
X -= mod;
}
int main() {
freopen("diviz.in", "r", stdin);
freopen("diviz.out", "w", stdout);
int K, A, B;
scanf("%d%d%d\n", &K, &A, &B);
gets(x + 1);
int N = strlen(x + 1);
for (int i = N; i >= 1; --i) {
for (int c = 0; c <= 9; ++c)
next[c][i] = next[c][i + 1];
next[x[i] - '0'][i] = i;
}
for (int c = 1; c <= 9; ++c)
dp[1][next[c][1]][c % K] = 1;
int res = 0;
for (int len = 1; len <= B; ++len) {
for (int i = 1; i <= N; ++i)
for (int r = 0; r < K; ++r)
if (dp[len & 1][i][r]) {
for (int c = 0; c <= 9; ++c) {
int nextPos = next[c][i + 1];
int nextRem = (r * 10 + c) % K;
add(dp[(len + 1) & 1][nextPos][nextRem], dp[len & 1][i][r]);
}
if (r == 0 && len >= A)
add(res, dp[len & 1][i][r]);
dp[len & 1][i][r] = 0;
}
}
printf("%d", res);
return 0;
}