Pagini recente » Cod sursa (job #163014) | Cod sursa (job #1807936) | Cod sursa (job #1520069) | Cod sursa (job #2392045) | Cod sursa (job #20570)
Cod sursa(job #20570)
#include <stdio.h>
#include <string.h>
#define MOD 30103
#define NMAX 205
#define KMAX 205
#define CMAX 11
#define INF 1000000000
int A[NMAX][KMAX], B[NMAX][KMAX];
int Viz[CMAX], First[CMAX][NMAX];
char S[NMAX];
int N, K, L, U, i, j, cif, r;
int Sol;
int modulo(int x, int mod)
{
while (x >= mod) x -= mod;
return x;
}
int main()
{
freopen("diviz.in", "r", stdin);
freopen("diviz.out", "w", stdout);
scanf("%d %d %d\n", &K, &L, &U);
scanf("%s", S+1), N = strlen(S+1);
for (cif = 0; cif <= 9; cif++)
{
First[cif][N + 1] = INF;
for (i = N; i >= 1; i--)
if (S[i] - '0' != cif)
First[cif][i] = First[cif][i+1];
else First[cif][i] = i;
}
for (i = 1; i <= N; i++) cif = S[i] - '0',
A[i][cif % K] = (!Viz[cif] && cif),
Viz[cif] = 1;
if (L == 1)
for (i = 1; i <= N; i++)
Sol = modulo(Sol + A[i][0], MOD);
for (j = 2; j <= U; j++)
{
for (i = j - 1; i < N; i++)
{
for (r = 0; r < K; r++)
{
for (cif = 0; cif <= 9; cif++)
{
int cf = First[cif][i + 1];
if (cf == INF) continue;
int rn = modulo((r * 10) + cif, K);
B[cf][rn] = modulo(B[cf][rn] + A[i][r], MOD);
}
}
}
if (j >= L)
for (i = 1; i <= N; i++)
Sol = modulo(Sol + B[i][0], MOD);
memcpy(A, B, sizeof(B));
memset(B, 0, sizeof(B));
}
printf("%d\n", modulo(Sol, MOD));
return 0;
}