Pagini recente » Cod sursa (job #2934615) | Cod sursa (job #682203) | Cod sursa (job #173488) | Cod sursa (job #2329730) | Cod sursa (job #734031)
Cod sursa(job #734031)
#include <cstring>
#include <fstream>
#include <vector>
using namespace std;
const int MOD = 30103;
int K, A, B;
char N[202];
int P[2][202][102], result;
bool is[10], final[202];
int last[10], prev[202];
int main()
{
ifstream fin("diviz.in");
ofstream fout("diviz.out");
fin >> K >> A >> B >> N;
int M = strlen(N);
for (int i = 1; i <= M; ++i)
{
if (last[N[i - 1] - '0']) prev[i] = last[N[i - 1] - '0'];
last[N[i - 1] - '0'] = i;
}
int act = 0;
for (int i = 1; i <= M; ++i) // cu i cifre
{
act = !act;
memset(P[act], 0, sizeof(P[act]));
for (int j = i; j <= M; ++j) // se termina pana in j
{
if (i == 1) P[act][j][(N[j - 1] - '0') % K] = 1;
for (int k = 0; k < K; ++k) // cel dinainte avea restul k
{
P[act][j][(k * 10 + N[j - 1] - '0') % K] += P[!act][j - 1][k];
if (P[act][j][(k * 10 + N[j - 1] - '0') % K] >= MOD) P[act][j][(k * 10 + N[j - 1] - '0') % K] -= MOD;
}
}
for (int j = 1; j <= M; ++j)
for (int k = 0; k < K; ++k)
{
P[act][j][k] += P[act][j - 1][k];
if (prev[j]) P[act][j][k] -= P[act][prev[j]][k] - P[act][prev[j] - 1][k];
while (P[act][j][k] >= MOD) P[act][j][k] -= MOD;
while (P[act][j][k] < 0) P[act][j][k] += MOD;
}
if (i >= A && i <= B)
{
result += P[act][M][0];
if (result >= MOD) result -= MOD;
}
}
fout << result << '\n';
fin.close();
fout.close();
}