Pagini recente » Cod sursa (job #1992232) | Cod sursa (job #842848) | Cod sursa (job #140583) | Cod sursa (job #746448) | Cod sursa (job #2982541)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("diviz.in");
ofstream fout("diviz.out");
const int mod = 30103;
int dp[205][205][105];
int first[10][205];
/// dp[j][i][r] -> numarul de subsiruri distincte de lungime j care contin ultima cifra cea de-a i-a cifra
/// a numarului n, subsiruri care sa dea restul r prin impartirea la k
int k;
int a, b;
char s[205];
int main()
{
fin >> k;
fin >> a >> b;
fin.get();
fin >> (s + 1);
int n = strlen(s + 1);
for(int cifra = 0; cifra <= 9; cifra ++)
{
int last = n + 1;
for(int i = n; i >= 1; i --)
{
int v = (s[i] - '0');
if(v == cifra)
{
first[cifra][i] = i;
last = i;
}
else
{
first[cifra][i] = last;
}
}
}
for(int cifra = 1; cifra <= 9; cifra ++)
{
dp[1][first[cifra][1]][cifra % k] = 1;
}
for(int j = 1; j < b; j ++)
{
for(int i = 1; i < n; i ++)
{
for(int rest = 0; rest < k; rest ++)
{
for(int cifra = 0; cifra <= 9; cifra ++)
{
if(first[cifra][i + 1] != n + 1)
{
dp[j + 1][first[cifra][i + 1]][(rest * 10 + cifra) % k] += dp[j][i][rest];
dp[j + 1][first[cifra][i + 1]][(rest * 10 + cifra) % k] %= mod;
}
}
}
}
}
int r = 0;
for(int nrCif = a; nrCif <= b; nrCif ++)
{
for(int i = 1; i <= n; i ++)
{
r += dp[nrCif][i][0];
r %= mod;
}
}
fout << r << '\n';
return 0;
}