Cod sursa(job #917697)

Utilizator apopeid13Apopeid Alejandro apopeid13 Data 18 martie 2013 11:35:29
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include <algorithm>
#include <stdio.h>
#define restRez 30103
#define MAX 210
using namespace std;
int k, a, b, n, sol;
char strBuff[MAX];
int pos[MAX][MAX][10], ds[MAX][MAX], pt[MAX][MAX];
int main()
{
freopen("diviz.in", "r", stdin);
freopen("diviz.out", "w", stdout);
scanf("%d %d %d\n", &k, &a, &b);
fgets(strBuff + 1, MAX, stdin);
for (; strBuff[n + 1] != '\n'; n++);
for (int i = 1; i <= n; i++)
{
int c = strBuff[i] - '0';
for (int l = b; l > 1; l--)
for (int r = 0; r < k; r++)
ds[l][r] = pos[l][r][c];
for (int l = b; l > 1; l--)
for (int r = 0; r < k; r++)
pos[l][(10 * r + c) % k][c] = (pos[l][(10 * r + c) % k][c] + pt[l - 1][r]) % restRez;
for (int l = b; l > 1; l--)
for (int r = 0; r < k; r++)
{
pos[l][r][c] = (pos[l][r][c] + restRez - ds[l][r]) % restRez;
pt[l][r] = (pt[l][r] + pos[l][r][c] + restRez - ds[l][r]) % restRez;
}
if (c)
{
if (!pos[1][c % k][c])
pt[1][c % k]++;
pos[1][c % k][c] = 1;
}
}
for (int i = a; i <= b; i++)
sol = (sol + pt[i][0]) % restRez;
printf("%d\n", sol);
fclose(stdin);
fclose(stdout);
return 0;
}