Cod sursa(job #553062)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 13 martie 2011 15:31:29
Problema Diviz Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include<stdio.h>
#include<string>
#define maxN 210
#define MOD 30103
FILE*f=fopen("diviz.in","r");
FILE*g=fopen("diviz.out","w");

int K,A,B,N,Rez,k,i,ii,j,cf;
int Fap[11][maxN],D1[maxN][105],D2[maxN][105];
char X[maxN];

int main () {
	fscanf(f,"%d %d %d\n%s",&K,&A,&B,X+1);
	N = strlen(X+1);
	
	for ( i = 1 ; i <= N ; ++i ){
		X[i] = X[i] - '0';
	}
	for ( cf = 0 ; cf <= 9 ; ++cf ){
		for ( i = N ; i >= 1 ; --i ){
			if ( X[i] == cf )
				Fap[cf][i] = i;
			else
				Fap[cf][i] = Fap[cf][i+1];
		}
	}
	for ( cf = 1; cf <= 9 ; ++cf ){
		D1[ Fap[cf][1] ][ cf % K ] = 1;
	}		
	
	for ( j = 1 ; j < B ; ++j ){
		//lungime j
		for ( i = j ; i <= N ; ++i ){
			//se termina pe pozitia i
			for ( k = 0 ; k < K ; ++k ){
				if ( !D1[i][k] )	continue ; 
				for ( cf = 0 ; cf <= 9 ; ++cf ){
					D2[ Fap[cf][i+1] ][ (k * 10 + cf ) % K ] += D1[i][k];
					if ( D2[ Fap[cf][i+1] ][ (k * 10 + cf ) % K ] >= MOD )
						D2[ Fap[cf][i+1] ][ (k * 10 + cf ) % K ] -= MOD;
				}
			}
		}
		if ( j >= A ){
			for ( i = j ; i <= N ; ++i ){
				Rez += D1[i][0];
				if ( Rez >= MOD )
					Rez -= MOD;
			}
			if ( j == B - 1 ){
				for ( i = j ; i <= N ; ++i ){
					Rez += D2[i][0];
					if ( Rez >= MOD )
						Rez -= MOD;
				}
			}
		}
		if ( j < B - 1 ){
			memcpy(D1,D2,sizeof(D2));
			memset(D2,0,sizeof(D2));
		}
	}
	
	fprintf(g,"%d\n",Rez);
	
	fclose(f);
	fclose(g);
	
	return 0;
}