Pagini recente » Monitorul de evaluare | Cod sursa (job #1746151) | Cod sursa (job #291112) | Cod sursa (job #2197598) | Cod sursa (job #1120534)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin ("diviz.in");
ofstream fout ("diviz.out");
const int NMAX = 106;
const int MOD = 30103;
int K; int A; int B;int M;
int D[2][2 * NMAX][2 * NMAX]; int last[10]; int result;
char N[2 * NMAX];
int main() {
fin >> K >> A >> B;
fin.get();
fin.get(N + 1, NMAX, '\n');
M = strlen(N + 1);
int ant = 0;
for(int i = 1; i <= M; ++i) { //cu i cifre
ant = !ant;
memset(D[ant], 0, sizeof(D[ant]));
for(int j = 1; j <= M; ++j) { //pana in j, se termina cu j
if(N[j] != '0' && i == 1) D[ant][j][ (N[j] - '0') % K] = 1;
for(int k = 0 ; k < K; ++k) {
D[ant][j][ (k * 10 + N[j] - '0') % K] += D[!ant][j - 1][k];
if(D[ant][j][(k * 10 + N[j] - '0') % K] >= MOD)
D[ant][j][(k * 10 + N[j] - '0') % K] -= MOD;
}
}
for(int k = 0 ;k < K; ++k) {
memset(last, 0, sizeof(last));
for(int j = 1; j <= M; ++j) {
D[ant][j][k] -= last[ N[j] - '0'];
last[N[j] - '0'] += D[ant][j][k];
D[ant][j][k] += D[ant][j - 1][k];
while(D[ant][j][k] >= MOD) D[ant][j][k] -= MOD;
while(D[ant][j][k] < 0) D[ant][j][k] += MOD;
}
}
if(A <= i && i <= B) {
result = (result + D[ant][M][0]) % MOD;
}
}
fout << result << '\n';
return 0;
}