Cod sursa(job #13333)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 6 februarie 2007 11:44:05
Problema Diviz Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <stdio.h>
#include <string.h>

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

int K, A, B, nN;
char N[MAXN];
unsigned char first[MAXN][11];
unsigned short nr[2][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++);
	int i, j, k, c;

	for (c = 0; c < 10; ++c)
		first[nN][c] = nN;
	for (i = nN - 1; i >= 0; --i)
	{
		for (j = 0; j < 10; j++)
			first[i][j] = first[i + 1][j];
		first[i][ N[i] - '0' ] = i;
	}

	for (i = 1; i < 10; i++)
		nr[1][ first[0][i] ][i % K] = 1;

	unsigned int NR = 0, step = 1;
	for (j = 1; j < B; j++, step ^= 1)
	{
		memset( nr[1 ^ step], 0, sizeof( nr[1 ^ step] ) );
		if (A <= j)
			for (i = j - 1; i < nN; i++)
			{
				NR += nr[step][i][0];
				if (NR >= MOD)
					NR -= MOD;
			}
		for (i = j - 1; i < nN; i++)
			for (k = 0; k < K; k++)
				for (c = 0; c < 10; c++)
				{
					int _i = first[i + 1][c];
					if (_i == nN)
						continue;
	
					int _k = (k * 10 + c) % K;

					nr[1 ^ step][_i][_k] += nr[step][i][k];
					if (nr[1 ^ step][_i][_k] >= MOD)
						nr[1 ^ step][_i][_k] -= MOD;
				}
	}
	for (i = B - 1; i < nN; i++)
	{
		NR += nr[step][i][0];
		if (NR >= MOD)
			NR -= MOD;
	}
	printf("%d\n", NR);
	return 0;
}