Cod sursa(job #6936)

Utilizator vlad_DVlad Dumitriu vlad_D Data 21 ianuarie 2007 10:58:14
Problema Diviz Scor 70
Compilator cpp Status done
Runda preONI 2007, Runda 1, Clasele 11-12 Marime 1.2 kb
#include <stdio.h>

//using namespace std;

int A, B, K, N;
int ret;
int v[201][101];
int aux[201][101];
char nr[300];
void in() {
	freopen("diviz.in", "r", stdin);
	scanf("%d %d %d\n", &K, &A, &B);
	scanf("%s", &nr);
	for (int i=0; nr[i]; i++) N++;	
	}
void out() {
	freopen("diviz.out", "w", stdout);
	printf("%d\n", ret);
	fclose(stdout);
	};
int main() {
	in();
	int i, j, k, L;
	for (i=1; i<=N; i++) {
		int c = nr[i-1] - '0';
		if (c != 0) aux[i][c%K]=1;
		}
	for (L=2; L<=B; L++) {
		for ( i = L; i<=N; i++) {
			int c = nr[i-1] - '0';
			int usa[10];
			for (j=0; j<=9; j++) usa[j] = 0;
			//fale pe alea care se termina in i
			for (j=i-1; j>=L-1; j--) if (usa[nr[j-1]-'0'] == 0) { 
				usa[nr[j-1]-'0'] = 1;
				for (k=0; k<K; k++) {
					int bb = k * 10 + c; bb%=K;
					v[i][bb]= (v[i][bb] + aux[j][k])%30103;}
				
				}
			//deci am facut totate v[i][K] .. duuuh?
			}
			if (L >=A) {
			int usa[10];
			for (i=0; i<=9; i++) usa[i] = 0;
			for (i=N; i>=1; i--) if (usa[nr[i-1]-'0'] == 0) {usa[nr[i-1]-'0'] = 1; ret= (ret + v[i][0])%30103;}
			}
		for (i=1; i<=N; i++) for (j=0; j<K; j++) aux[i][j] = v[i][j], v[i][j] = 0;
		//copie auxu
		}
	out();
	return 0;
}