Cod sursa(job #267478)

Utilizator katakunaCazacu Alexandru katakuna Data 27 februarie 2009 16:06:20
Problema Diviz Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include<stdio.h>
#define MOD 30103
#define nmax 111
#include<algorithm>
using namespace std;

int viz[nmax],n,x,poz[nmax][nmax],c[nmax],k,i,ii,j,l,b[nmax][nmax],a[nmax][nmax],sol,B,A;

int main(){

	FILE *f = fopen("diviz.in","r");
	FILE *g = fopen("diviz.out","w");
	
	fscanf(f,"%d %d %d\n",&k,&A,&B);
	fscanf(f,"%c",&x);
	
	while(!feof(f) && x!='\n'){
		c[++n] = x - '0';
		fscanf(f,"%c",&x);
	}
	
	
	for(i=1; i<=n; i++)
		if(c[i] && !viz[c[i]] ){
			a[i][c[i] % k] = 1;
			viz[c[i]] = 1;
			if( A<=i && i <=B && c[i] % k == 0)
				sol+=1;
		}	
	
	sol%=MOD;
	for(i=n; i>=1; i--){
		for(j=0; j<=9; j++){
			if(poz[j][i+1] && !poz[j][i])
				poz[j][i] = poz[j][i+1];
		}
		poz[c[i]][i-1] = i;
	}
	
	for(l=2; l<=B; l++){
		
		for(i=1; i<=n; i++)
			for(j=0; j<=k; j++)
				for(ii=0; ii<=9; ii++)
					if(poz[ii][i]){
						b[ poz[ii][i] ][ (j*10 + ii) % k ]+=a[i][j];
						b[ poz[ii][i] ][ (j*10 + ii) % k ]%=MOD;
					}
		
		if(A <= l && l <= B){
			for(i=1; i<=n; i++){
				sol+=b[i][0];
				sol%=MOD;
			}
			
		}
		
		for(i=0; i<=n; i++){
			memcpy(a[i], b[i], sizeof(a[i]));
			memset(b[i], 0, sizeof(b[i]));
		}
	}
	
	fprintf(g,"%d",sol);
	
	fclose(f);
	fclose(g);

	return 0;
}