Pagini recente » Cod sursa (job #2885477) | Cod sursa (job #1737703) | Cod sursa (job #189225) | Cod sursa (job #1994874) | Cod sursa (job #16974)
Cod sursa(job #16974)
#include <stdio.h>
#include <string.h>
#define NMAX 202
#define KMAX 102
#define CMAX 10
#define MOD 30103
#define INF 666000666
int D[2][NMAX][KMAX], N, A, B, K, First[CMAX][NMAX], V[NMAX], Rez, Cif[CMAX], Sf[CMAX][NMAX];
int rest[4510];
int mod(int s)
{
return (s>=MOD ? (s-MOD):s);
}
int main()
{
int i, j, r, cif, s = 0, d = 1, t;
char c[NMAX];
freopen("diviz.in", "r", stdin);
scanf("%d %d %d ", &K, &A, &B);
gets(c);
N = strlen(c);
for (i = 0; i < N; i++)
{
V[i+1] = c[i]-48;
Cif[V[i+1]] = 1;
First[V[i+1]][i+1] = i+1;
Sf[V[i+1]][i+1] = i+1;
}
for (i = 0; i < 4500; i++) rest[i] = i%K;
for (cif = 0; cif < CMAX; cif++)
for (i = 1; i <= N; i++)
for (j = i+1; j <= N; j++)
if (V[i] == V[j]) { First[ V[i] ][j] = j; break; }
for (cif = 0; cif < CMAX; cif++)
First[cif][N+1] = INF;
for (cif = 0; cif < CMAX; cif++)
{
for (i = N; i >= 1; i--)
First[cif][i] = (First[cif][i] == 0 ? First[cif][i+1]:First[cif][i]);
for (i = 1; i <= N; i++)
Sf[cif][i] = Sf[cif][i-1]+(cif==V[i]);
}
for (cif = 1; cif < CMAX; cif++)
if (Cif[cif]) D[0][ First[cif][1] ][ cif%K ] = 1;
if (A == 1)
for (j = 1; j <= N; j++) Rez += D[0][j][0];
for (i = 2; i <= B; i++)
{
for (j = i-1; j < N; j++)
for (r = 0; r < K; r++)
for (cif = 0; cif < CMAX; cif++)
if (First[cif][j+1] < INF && (Sf[cif][ First[cif][j+1]-1 ]-Sf[cif][j+1] <= 0))
{
t = (r*10+cif);
D[d][ First[cif][j+1] ][ rest[t] ] = mod(D[d][ First[cif][j+1] ][ rest[t] ]+D[s][j][r]);
}
for (j = 1; j <= N; j++)
Rez = mod(Rez+(i>=A)*D[d][j][0]);
s = (s+1)&1; d = (d+1)&1;
for (j = 0; j < NMAX; j++)
for (r = 0; r < KMAX; r++) D[d][j][r] = 0;
}
freopen("diviz.out", "w", stdout);
printf("%d\n", Rez);
return 0;
}