Pagini recente » Cod sursa (job #592241) | Cod sursa (job #3143223) | Cod sursa (job #651838) | Cod sursa (job #79062) | Cod sursa (job #13329)
Cod sursa(job #13329)
#include <stdio.h>
#include <string.h>
#define MAXN 205
#define MAXK 105
#define MOD 30103
int K, A, B, nN;
char N[MAXN];
unsigned char first[MAXN][11];
unsigned short nr[2][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++)
first[nN][j] = nN;
for (int i = nN - 1; i >= 0; i--)
{
for (int j = 0; j < 10; j++)
first[i][j] = first[i + 1][j];
first[i][ N[i] - '0' ] = i;
}
for (int i = 1; i < 10; i++)
nr[1][ first[0][i] ][i % K] = 1;
unsigned int NR = 0, step = 1;
for (int j = 1; j <= B; j++, step ^= 1)
{
memset( nr[1 ^ step], 0, sizeof( nr[1 ^ step] ) );
for (int i = j - 1; i < nN; i++)
{
if (A <= j)
{
NR += nr[step][i][0];
if (NR >= MOD)
NR -= MOD;
}
for (int k = 0; k < K; k++)
for (int c = 0; c < 10; c++)
{
if (first[i + 1][c] == nN)
continue;
int _i = first[i + 1][c], _k = (k * 10 + c) % K;
nr[1 ^ step][_i][_k] += nr[step][i][k];
if (nr[1 ^ step][_i][_k] >= MOD)
nr[1 ^ step][_i][_k] -= MOD;
}
}
}
printf("%d\n", NR);
return 0;
}