Pagini recente » Cod sursa (job #1395232) | Cod sursa (job #2224010) | Cod sursa (job #2421197) | Cod sursa (job #2248549) | Cod sursa (job #12339)
Cod sursa(job #12339)
#include <stdio.h>
#include <string.h>
#define MAX_N 105
#define MAX_K 105
#define FIN "diviz.in"
#define FOUT "diviz.out"
#define FOR(i, a, b) for (i = (a); i < (b); i++)
#define MOD 30103
int K, A, B, pos[MAX_N][10]; char N[256];
unsigned X[MAX_N][MAX_K], Y[MAX_N][MAX_K], Res;
inline void add(unsigned &a, unsigned &b)
{
a += b;
while (a >= MOD) a -= MOD;
}
int main(void)
{
int i, j, k, c, n;
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%d %d %d", &K, &A, &B);
scanf("%s", N);
n = strlen(N);
for (i = 0; i < 10; i++) pos[n+1][i] = n+1;
for (i = n; i >= 0; i--)
for (j = 0; j < 10; j++)
pos[i][j] = i > 0 && N[i-1] == j+'0' ? i : pos[i+1][j];
X[0][0] = 1;
FOR (i, 1, B+1)
{
FOR (j, 0, n) FOR (k, 0, K)
{
if (!X[j][k]) continue;
FOR (c, 0, 10)
{
if (i == 1 && !c) continue;
add(Y[pos[j+1][c]][(k*10+c)%K], X[j][k]);
}
}
memcpy(X, Y, sizeof(Y));
memset(Y, 0, sizeof(Y));
if (i < A) continue;
FOR (j, 0, n+1) add(Res, X[j][0]);
}
printf("%d\n", Res);
return 0;
}