Cod sursa(job #8321)

Utilizator vrajalaMihai Viteazu, razboinicu luminii vrajala Data 24 ianuarie 2007 17:03:53
Problema Diviz Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <stdio.h>;
#include <stdlib.h>;
#include <string.h>;

long a[201][201][101],tot;
int cc,n,aa,b,k,i,j,r,t[201],cif[201][10];
int max_cif=10;
long mod=30103;
char c[200];

void citire()
{
	freopen("divz.in","r",stdin);
	scanf("%d%d%d\n",&k,&aa,&b);
	scanf("%s",&c);
	n=strlen(c);
	for (i=0;i<n;++i)
		t[i]=c[i]-'0';
	fclose(stdin);
}

void cifre()
{
for (j=0;j<max_cif;++j)
	cif[n-1][j]=-1;
cif[n-1][t[n-1]]=n-1;
for (i=n-2;i>=0;--i)
	{
	  memcpy(cif[i],cif[i+1],sizeof(cif[i+1]));
	  cif[i][t[i]]=i;
	}
}

void dinamica()
{
for (i=0;i<max_cif;++i)
	a[1][cif[0][i]][i%k]=1;
for (i=1;i<=b;++i)
	for (j=i-1;j<n-1;++j)
		for (r=0;r<k;++r)
			for (cc=0;cc<max_cif;++cc)
				if (cif[j+1][cc] != -1)
					{
					a[i+1][cif[j+1][cc]][((r*10)+cc)%k] += a[i][j][r];
					a[i+1][cif[j+1][cc]][((r*10)+cc)%k] %= mod;
					if (a[3][0][0]==1)
                                        	i=i;
					}
}

int main()
{
	citire();
	cifre();
	dinamica();
	for (i=aa;i<=b;++i)
		for (j=0;j<n;++j)
			tot += a[i][j][0];
	tot %= mod;
	freopen("divz.out","w",stdout);
	printf("%ld",tot);
	fclose(stdout);
return 0;
}