Pagini recente » Cod sursa (job #61495) | Cod sursa (job #673162) | Cod sursa (job #2773683) | Cod sursa (job #2715865) | Cod sursa (job #17602)
Cod sursa(job #17602)
#include <stdio.h>
#include <string.h>
#define NMAX 210
int K, A, B;
char a[NMAX];
char aux[NMAX];
int ua[10][NMAX];
long long ant[NMAX][NMAX];
long long cur[NMAX][NMAX];
int main()
{
int i, j, k, cant, N, ra;
freopen("diviz.in", "r", stdin);
freopen("diviz.out", "w", stdout);
scanf("%d %d %d", &K, &A, &B);
scanf("%s", a);
N = strlen(a);
for (i = 0; i < N; i++) aux[N - i - 1] = a[i];
memcpy(a, aux, sizeof(a));
for (N = 0; a[N]; N++)
ua[a[N] - '0'][N + 1] = N + 1;
for (i = 1; i <= N; i++)
for (j = 0; j < 10; j++)
if (!ua[j][i]) ua[j][i] = ua[j][i - 1];
int c, mod = 1;
long long rez = 0;
for (i = 1; i <= B; i++) {
for (j = i; j <= N; j++) {
c = a[j-1] - '0';
if (i == 1) {
cur[j][c % K] = 1;
continue;
}
for (k = 0; k < K; k++) {
for (cant = 0; cant < 10; cant++) {
if (!ua[cant][j - 1]) continue;
ra = k - c * mod;
ra %= K;
if (ra < 0) ra += K;
// if (j == 2) printf("%d (%d) - %d\n", cant, ua[cant][j-1], ra);
cur[j][k] += ant[ ua[cant][j - 1] ][ra];
}
}
}
/* for (j = 1; j <= N; j++) {
for (k = 0; k < K; k++) printf("%d ", cur[j][k]);
printf("\n");
}
printf("\n");
*/
if (A <= i) {
for (j = 1; j < 10; j++)
if (ua[j][N]) rez += cur[ ua[j][N] ][0];
}
memcpy(ant, cur, sizeof(cur));
memset(cur, 0, sizeof(cur));
mod *= 10; mod %= K;
}
printf("%lld\n", rez);
fclose(stdin);
fclose(stdout);
return 0;
}