Pagini recente » Cod sursa (job #114310) | Cod sursa (job #2843573) | Cod sursa (job #993941) | Cod sursa (job #1208970) | Cod sursa (job #2618866)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("diviz.in");
ofstream fout("diviz.out");
const int nmax = 200, mod = 30103;
int k, a, b, v[nmax + 5], dp[2][nmax + 5][101], first[10][nmax + 5], n;
char ch;
int solve(int lungime, int index, int nr)
{
int start = 0;
if (lungime == 0)
{
++start;
}
int ans = 0;
if (lungime >= a && lungime <= b && nr == 0) ans = 1;
for (int i = start; i <= 9; ++i)
{
int next = first[i][index + 1];
if (next <= n)
{
ans = (ans + solve(lungime + 1, next, (nr * 10 + i) % k));
}
}
return ans;
}
int main()
{
fin >> k >> a >> b;
while (fin >> ch) v[++n] = ch - '0';
for (int i = 0; i <= 9; ++i) first[i][n + 1] = n + 1;
for (int i = n; i >= 1; --i)
{
for (int j = 0; j <= 9; ++j)
{
if (v[i] == j) first[j][i] = i;
else first[j][i] = first[j][i + 1];
}
}
for (int l = n; l >= 0; --l)
{
for (int i = n; i >= 0; --i)
{
for (int j = k - 1; j >= 0; --j)
{
int ans = 0;
if (l >= a && l <= b && j == 0) ans = 1;
int start = 0;
if (l == 0)
{
++start;
}
for (int cif = start; cif <= 9; ++cif)
{
int next = first[cif][i + 1];
if (next <= n)
{
ans = (ans + dp[(l + 1) % 2][next][(j * 10 + cif) % k]) % mod;
}
}
dp[l % 2][i][j] = ans;
}
}
}
fout << dp[0][0][0];
fin.close();
fout.close();
return 0;
}