Pagini recente » Cod sursa (job #1606842) | Cod sursa (job #1554703) | Cod sursa (job #2596412) | Cod sursa (job #690112) | Cod sursa (job #1044641)
#include <iostream>
#include <fstream>
#include <cstring>
#include <queue>
#define MOD 30103
#define LgMax 205
#define KMax 105
using namespace std;
int answer;
int K, A, B, n;
char aux[LgMax];
int N[LgMax];
int dp[2][LgMax][KMax];
bool uz[10];
struct stare
{
int j, r;
stare ()
{
j = r = 0;
}
stare (const int _j, const int _r)
{
j = _j;
r = _r;
}
};
queue <stare> Q;
/**
dp[i][j][r] = numarul de subsiruri de lungime i, folosind din primele j, inclusiv j,
care dau restul r la impartirea la K
dp[i, j, r] -> dp[i+1, t, (r*10 + N[t]) % K], t = j+1...lungime(N)
*/
void Read()
{
ifstream f ("diviz.in");
f>>K>>A>>B;
f>>(aux+1);
f.close();
}
void Init()
{
n = strlen(aux+1);
int i;
for (i=1; i<=n; ++i)
{
N[i] = aux[i] - '0';
if (N[i] == 0)
continue;
if (!uz[N[i]])
uz[N[i]] = true;
else
continue;
dp[1][i][N[i] % K] = 1;
Q.push(stare(i, N[i]%K));
}
for (i=0; i<10; ++i)
uz[i] = false;
}
void Solve()
{
Init();
int line, i;
for (i = 1, line = 0; i<=B; ++i, line = 1-line)
{
while (!Q.empty())
{
stare st = Q.front();
Q.pop();
dp[1-line][st.j][st.r] %= MOD;
if (A <= i && i <= B && st.r == 0)
answer = (answer + dp[1 - line][st.j][st.r]) % MOD;
for (int t = st.j+1; t<=n; ++t)
{
if (!uz[N[t]])
uz[N[t]] = true;
else
continue;
dp[line][t][(st.r*10 + N[t]) % K] += dp[1-line][st.j][st.r]; /// mod
}
dp[1 - line][st.j][st.r] = 0;
for (int t = 0; t<10; ++t)
uz[t] = false;
}
for (int t = 1; t<=n; ++t)
for (int r = 0; r<K; ++r)
if (dp[line][t][r])
Q.push(stare(t, r));
}
}
void Write()
{
ofstream g("diviz.out");
g<<answer<<"\n";
g.close();
}
int main()
{
Read();
Solve();
Write();
return 0;
}