Cod sursa(job #8157)

Utilizator MariusMarius Stroe Marius Data 23 ianuarie 2007 21:21:56
Problema Diviz Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <cstdio>
#include <memory>
#include <cstring>
using namespace std;

const char iname[] = "diviz.in;
const char oname[] = "diviz.out";

#define MAX_N 200
#define MAX_K 100
#define modulo 30103

char X[MAX_N];

int  first[10][MAX_N];

int  cnt[2][MAX_N][MAX_K];

int  Res;

int main(void) {
	freopen(iname, "r", stdin);
	int L;
	int K, A, B;
	scanf("%d %d %d\n", & K, & A, & B);
	scanf("%s\n", X);
	L = int(strlen(X));
	for (int c = 0; c < 10; ++c) {
		first[c][L] = L;
		for (int i = L; i--; ) {
			if (X[i] - '0' == c)
				first[c][i] = i;
			else
				first[c][i] = first[c][i + 1];
		}
	}
	int stp = 0;
	for (int c = 0; c < 10; ++c) {
		for (int i = 0; i < L; ++i)
			if (X[i] - '0' == c) {
				cnt[stp][i][c % K] = 1;
				break ;
			}
	}
	for (int j = stp = 1; j < L; ++j) {
		memset(cnt[stp], 0, sizeof(cnt[stp]));
		for (int i = j - 1; i < L; ++i) {
			for (int r = 0; r < K; ++r)
				for (int c = 0; c < 10; ++c) {
					int sum = cnt[stp][first[c][i + 1]][(r * 10 + c) % K];
					cnt[stp][first[c][i + 1]][(r * 10 + c) % K] = (sum + cnt[1 ^ stp][i][r]) % modulo;
				}
			if ((A <= j) && (j <= B))
				Res = (Res + cnt[1 ^ stp][i][0]) % modulo;
		}
		stp ^= 1;
	} 
	if (B == L) {
		for (int i = 0; i < L; ++i)
			Res = (Res + cnt[1 ^ stp][i][0]) % modulo;
	}
	freopen(oname, "w", stdout);
	printf("%d\n", Res);
	return 0;
}