Cod sursa(job #8285)

Utilizator vlad_DVlad Dumitriu vlad_D Data 24 ianuarie 2007 03:01:54
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
/*
Pt toti fanii mei ;) ...
..eh comentarii prea multe ca am imbunatatit de la n^3*k la altceva ..lol

*/
#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;
	int lu[10];
	for (i=0; i<10; i++) lu[i] = 0;
	for (i=1; i<=N; i++) {
		int c = nr[i-1] - '0';
		if (c!=0 && c % K ==0 && A == 1 && lu[c] ==0) { lu[c] = 1; ret++;}
		if (c != 0) aux[i][c%K]=1;
		}
	for (L=2; L<=B; L++) {
		for (i=0; i<10; i++) lu[i] = 0;
		for (i=1; i<L; i++) lu[nr[i-1]-'0'] = i;
		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;
			int bb[100];
			for (j=0; j<K; j++) bb[j] = (j * 10 + c)%K;
			for (j=0; j<=9; j++) if (lu[j])
				
				
				for (k=0; k<K; k++) {
					//int bb = k * 10 + c; bb%=K;
					v[i][bb[k]]= (v[i][bb[k]] + aux[lu[j]][k])%30103;}
				
				//}
			//deci am facut totate v[i][K] .. duuuh?
			lu[c]=i;
			}
			if (L >=A) {
			//int usa[10];
			//for (i=0; i<=9; i++) usa[i] = 0;
			for (i=0; i<=9; i++) if (lu[i]) ret = (ret + v[lu[i]][0])%30103;
			//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;
}