Cod sursa(job #7490)

Utilizator wefgefAndrei Grigorean wefgef Data 21 ianuarie 2007 16:15:32
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <cstdio>
#include <string.h>

#define mod 30103
#define Nmax 256
#define Kmax 128

int n, a, b, K, v[Nmax];
int c[Nmax][Kmax][16], d[Nmax][Kmax];
char viz[Nmax][Kmax];

void readdata()
{
	freopen("diviz.in", "r", stdin);
	freopen("diviz.out", "w", stdout);
	
	char s[Nmax];
	int i;
	
	scanf("%d %d %d", &K, &a, &b);
	scanf("%s", &s);
	n = strlen(s);
	for (i = 1; i <= n; ++i)
		v[i] = s[i-1]-'0';
}

void solve()
{
	int i, j, k, l, k2, val, rez = 0;
	
	c[0][0][0] = 1;
	
	for (i = 1; i <= n; ++i)
	{
		for (j = b; j >= 0; --j)
		for (k = 0; k < K; ++k)
		{
			d[j][k] = 0;
			viz[j][k] = 0;
		}
		for (j = b-1; j >= 0; --j)
		for (k = 0; k < K; ++k)
		{
			if (v[i] == 0 && j == 0) continue;
			val = 0;
			for (l = 0; l < 10; ++l)
				val += c[j][k][l];
			k2 = (k*10+v[i]) % K;
			
			d[j+1][k2] += val;
			d[j+1][k2] %= mod;
			viz[j+1][k2] = 1;
		}
		for (j = b; j >= 0; --j)
		for (k = 0; k < K; ++k)
			if (viz[j][k])
				c[j][k][v[i]] = d[j][k];
	}

	for (j = a; j <= b; ++j)
	for (l = 0; l < 10; ++l)
		rez += c[j][0][l];
	rez %= mod;
	printf("%d\n", rez);
}

int main()
{
	readdata();
	solve();
	return 0;
}