Cod sursa(job #13158)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 5 februarie 2007 22:05:52
Problema Diviz Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <stdio.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[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++)
		first[nN][j] = nN;
	for (int i = nN - 1; i >= 0; i--)
	{
		for (int j = 0; j < 10; j++)
			first[i][j] = first[i + 1][j];
		first[i][ N[i] - '0' ] = i;
	}

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