Pagini recente » Cod sursa (job #2126159) | Cod sursa (job #1431877) | Cod sursa (job #1860455) | Cod sursa (job #1009185) | Cod sursa (job #13307)
Cod sursa(job #13307)
#include <stdio.h>
#define MAXN 205
#define MAXK 105
#define MOD 30103
int K, A, B, nN;
char N[MAXN];
short last[MAXN][11]; //last[i][j] = last position x <= i that has N[x] == j
unsigned short nr[MAXN][MAXN][MAXK];
int main()
{
freopen("diviz.in", "rt", stdin);
freopen("diviz.out", "wt", stdout);
scanf("%d %d %d %s", &K, &A, &B, N);
for (nN = 0; N[nN]; nN++);
for (int j = 0; j < 10; j++)
last[0][j] = -1;
last[0][ N[0] - '0' ] = 0;
for (int i = 1; i < nN; i++)
{
for (int j = 0; j < 10; j++)
last[i][j] = last[i - 1][j];
last[i][ N[i] - '0' ] = i;
}
// for (int i = 0; i < nN; i++, printf("\n"))
// for (int j = 0; j < 10; j++)
// printf("%2d ", last[i][j]);
// printf("%s\n", N);
unsigned int NR = 0;
for (int i = 0; i < nN; i++)
{
nr[i][1][ (N[i] - '0') % K ] = 1;
if (A <= 1)
{
NR += nr[i][1][0];
NR %= MOD;
}
// for (int k = 0; k < K; k++)
// printf("%d %d %d %d\n", i, 1, k, nr[i][1][k]);
for (int j = 2; j <= i + 1 && j <= B; j++)
{
for (int k = 0; k < K; k++)
{
for (int c = 0; c < 10; c++)
{
if (last[i - 1][c] == -1)
continue;
// if (first[i + 1][c] > first[i + 1][ N[i] - '0' ])
// continue;
// printf("%d %d %d += %d %d %d\n", i, j, (k * 10 + N[i] - '0') % K, last[i - 1][c], j - 1, k);
nr[i][j][ (k * 10 + N[i] - '0') % K ] += nr[ last[i - 1][c] ][j - 1][k];
nr[i][j][ (k * 10 + N[i] - '0') % K ] %= MOD;
}
}
// for (int k = 0; k < K; k++)
// printf("%d %d %d %d\n", i, j, k, nr[i][j][k]);
if (A <= j)
{
NR += nr[i][j][0];
NR %= MOD;
}
}
}
printf("%d\n", NR);
return 0;
}