Cod sursa(job #45375)

Utilizator mastermageSchneider Stefan mastermage Data 1 aprilie 2007 14:09:16
Problema Diviz Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <stdio.h>
#include <string.h>

#define maxN 210
#define maxK 110
#define cmod 30103

int n,k,a,b, res, vmk[maxN],kkk[maxN];
char vec[maxN];

int din[maxN][maxK], dinc[10][maxN][maxK];


void stab(int&x){while(x>=k)x-=k;}
void inputFunc(){
	FILE*fi=fopen("diviz.in","r");
	fscanf(fi,"%d %d %d %s",&k,&a,&b,vec);
	
	for(n=0;vec[n];n++){
		vec[n]-='0';vmk[n]=vec[n];stab(vmk[n]);
	}
	
	for(int i=0;i<k;i++)kkk[i]=i*10,stab(kkk[i]);
	fclose(fi);
}

void outputFunc(){
	FILE*fi=fopen("diviz.out","w");
	fprintf(fi,"%d",res);
	fclose(fi);
}



int main(){
	inputFunc();
	din[0][0]=1;

	for(int i=0;i<n;i++){
		int t=0;if(!vec[i])t=1;
		
		for(int j=i+1;j>t;j--){
			for(int l=0;l<k;l++)if(din[j-1][l]){
				int d;
				d=kkk[l]+vmk[i];stab(d);
				din[j][d]+=din[j-1][l]-dinc[vec[i]][j][d];
				dinc[vec[i]][j][d]+=din[j-1][l];
			}
		}
		
	}
	
	for(int i=a;i<=b;i++){res+=din[i][0];if(res>=cmod)res-=cmod;}
	outputFunc();
	return 0;
}