Cod sursa(job #17613)

Utilizator gcosminGheorghe Cosmin gcosmin Data 16 februarie 2007 14:12:07
Problema Diviz Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <stdio.h>
#include <string.h>

#define NMAX 210
#define MOD 30103

int K, A, B, N;

char a[NMAX];
char aux[NMAX];
int ua[10][NMAX];
int ant[NMAX][110];
int cur[NMAX][110];

int sol[NMAX];

#include <set>
#include <string>
using namespace std;

set <string> H;

string kkt;

void back(int k, int last, int mod)
{
	if (k == B + 1) return;

	if (A <= k && k <= B && !mod) {
		kkt.clear();
		for (int j = 0; j < k; j++) kkt.push_back(sol[j] + '0');
		H.insert(kkt);
	}

	int i;
	for (i = last + 1; i < N; i++) {
		if (k == 0 && a[i] == '0') continue;
		sol[k] = a[i] - '0';
		back(k + 1, i, (mod * 10 + a[i] - '0') % K);
	}
}

int main()
{
	int i, j, k, cant, ra;
	
	freopen("diviz.in", "r", stdin);
	freopen("diviz.out", "w", stdout);

	scanf("%d %d %d", &K, &A, &B);
	scanf("%s", a);

	N = strlen(a);

//	back(0, -1, 0);
//	printf("%d\n", (int) H.size());
	
	for (i = 0; i < N; i++) aux[N - i - 1] = a[i];
	memcpy(a, aux, sizeof(a));

	for (N = 0; a[N]; N++)
		ua[a[N] - '0'][N + 1] = N + 1;

	for (i = 1; i <= N; i++)
		for (j = 0; j < 10; j++)
			if (!ua[j][i]) ua[j][i] = ua[j][i - 1];

	int c, mod = 1;

	int rez = 0;

	for (i = 1; i <= B && i <= N; i++) {
		for (j = i; j <= N; j++) {
			c = a[j-1] - '0';

			if (i == 1) {
				cur[j][c % K] = 1;
				continue;
			}

			for (k = 0; k < K; k++) {
				for (cant = 0; cant < 10; cant++) {
					if (!ua[cant][j - 1]) continue;
					ra = k - c * mod;
					ra %= K;
					if (ra < 0) ra += K;

					cur[j][k] += ant[ ua[cant][j - 1] ][ra];
					if (cur[j][k] >= MOD) cur[j][k] -= MOD;
				}
			}
		}

/*		for (j = 1; j <= N; j++) {
			for (k = 0; k < K; k++) printf("%d ", cur[j][k]);
			printf("\n");
		}
		printf("\n");
*/
		if (A <= i) {
			for (j = 1; j < 10; j++) {
				if (ua[j][N]) rez += cur[ ua[j][N] ][0];
				if (rez >= MOD) rez -= MOD;
			}
		}

		memcpy(ant, cur, sizeof(cur));
		memset(cur, 0, sizeof(cur));
		mod *= 10; mod %= K;
	}

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

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