Pagini recente » Cod sursa (job #977234) | Cod sursa (job #1792223) | Cod sursa (job #1054651) | Cod sursa (job #263913) | Cod sursa (job #594144)
Cod sursa(job #594144)
# include <cstdio>
# include <cstring>
const char *FIN = "diviz.in", *FOU = "diviz.out" ;
const int MAX = 205, MOD = 30103;
char S[MAX] ;
int first[10][MAX], dp[2][MAX][105] ;
int A, B, K, sol ;
int main (void) {
fscanf (fopen (FIN, "r"), "%d %d %d %s", &K, &A, &B, S + 1) ;
int N = strlen (S + 1) ;
for (int i = 1; i <= N; ++i) S[i] -= '0' ;
for (int i = 0; i <= 9; ++i) {
for (int j = N; j > 0; --j) {
first[i][j] = (S[j] == i ? j : first[i][j + 1]) ;
}
}
for (int i = 1; i <= 9; ++i)
dp[0][ first[i][1] ][ i % K ] = 1 ;
for (int i = 1; i < B; ++i) {
for (int j = i; j <= N; ++j) {
for (int k = 0; k < K; ++k) {
if (dp[0][j][k]) {
for (int l = 0; l <= 9; ++l) {
dp[1][ first[l][j + 1] ][ (k * 10 + l) % K ] += dp[0][j][k],
dp[1][ first[l][j + 1] ][ (k * 10 + l) % K ] %= MOD ;
}
}
}
}
if (i >= A) {
for (int j = i; j <= N; ++j) {
sol += dp[0][j][0], sol %= MOD ;
}
}
if (i == B - 1) {
for (int j = i; j <= N; ++j) {
sol += dp[1][j][0], sol %= MOD ;
}
}
if (i < B - 1) {
memcpy (dp[0], dp[1], sizeof (dp[1]));
memset (dp[1], 0, sizeof (dp[1])) ;
}
}
fprintf (fopen (FOU, "w"), "%d", sol) ;
}