Cod sursa(job #13308)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 6 februarie 2007 09:13:10
Problema Diviz Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <stdio.h>

#define MAXN 205
#define MAXK 105
#define MOD 30103

int K, A, B, nN;
char N[MAXN];
short last[MAXN][11];				//last[i][j] = last position x <= i that has N[x] == j
unsigned short nr[MAXN][MAXN][MAXK];

int main()
{
	freopen("diviz.in", "rt", stdin);
	freopen("diviz.out", "wt", stdout);
	scanf("%d %d %d %s", &K, &A, &B, N);
	for (nN = 0; N[nN]; nN++);
	for (int j = 0; j < 10; j++)
		last[0][j] = -1;
	last[0][ N[0] - '0' ] = 0;
	for (int i = 1; i < nN; i++)
	{
		for (int j = 0; j < 10; j++)
			last[i][j] = last[i - 1][j];
		last[i][ N[i] - '0' ] = i;
	}

//	for (int i = 0; i < nN; i++, printf("\n"))
//		for (int j = 0; j < 10; j++)
//			printf("%2d ", last[i][j]);
//	printf("%s\n", N);

	unsigned int NR = 0;
	for (int i = 0; i < nN; i++)
	{
		nr[i][1][ (N[i] - '0') % K ] = 1;
		if (A <= 1)
		{
			NR += nr[i][1][0];
			NR %= MOD;
		}
		if (N[i] - '0' == 0)
			nr[i][1][0] = 0;
//		for (int k = 0; k < K; k++)
//			printf("%d %d %d %d\n", i, 1, k, nr[i][1][k]);
		for (int j = 2; j <= i + 1 && j <= B; j++)
		{
			for (int k = 0; k < K; k++)
			{
				for (int c = 0; c < 10; c++)
				{
					if (last[i - 1][c] == -1)
						continue;
	
					if (last[i - 1][c] < last[i - 1][ N[i] - '0' ])
						continue;
//					printf("%d %d %d += %d %d %d\n", i, j, (k * 10 + N[i] - '0') % K, last[i - 1][c], j - 1, k);
					nr[i][j][ (k * 10 + N[i] - '0') % K ] += nr[ last[i - 1][c] ][j - 1][k];
					nr[i][j][ (k * 10 + N[i] - '0') % K ] %= MOD;
				}
			}
//			for (int k = 0; k < K; k++)
//				printf("%d %d %d %d\n", i, j, k, nr[i][j][k]);
			if (A <= j)
			{
				NR += nr[i][j][0];
				NR %= MOD;
			}
		}
	}
	printf("%d\n", NR);
	return 0;
}