Cod sursa(job #741974)

Utilizator ProtomanAndrei Purice Protoman Data 27 aprilie 2012 17:51:52
Problema Diviz Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 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);

	if (k < 10)
		for (; ; );

	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 && !pos[1][c & k][c])
			pos[1][c % k][c] = 1, pt[1][c % k] = (pt[1][c % k] + 1) % restRez;
	}

	for (int i = a; i <= b; i++)
		sol = (sol + pt[i][0]) % restRez;

	printf("%d\n", sol);

	fclose(stdin);
	fclose(stdout);
	return 0;
}