Pagini recente » Cod sursa (job #1013183) | Cod sursa (job #1454841) | Cod sursa (job #1509641) | Cod sursa (job #1731662) | Cod sursa (job #2982553)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("diviz.in");
ofstream fout("diviz.out");
const int mod = 30103;
int dp[2][205][105];
int first[14][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;
}
int r = 0;
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) % 2][first[cifra][i + 1]][(rest * 10 + cifra) % k] += dp[j % 2][i][rest];
dp[(j + 1) % 2][first[cifra][i + 1]][(rest * 10 + cifra) % k] %= mod;
}
}
}
if(j >= a)
{
r += dp[j % 2][i][0];
r %= mod;
}
for(int rest = 0; rest < k; rest ++)
{
dp[j % 2][i][rest] = 0;
}
}
}
fout << r << '\n';
return 0;
}