Cod sursa(job #8347)

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

long a[201][101],aa[201][101],tot;
int cc,n,aaa,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,&aaa,&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)
	if (cif[0][i]!=-1)
	{
	aa[cif[0][i]][i%k]=1;
	if ((i%k==0)&&(1>=aaa)) tot+=aa[cif[0][i]][i%k];
	}
tot%=mod;
for (i=2;i<=b;++i)
    {
     memset(a,0,sizeof(a));
     for (j=i-2;j<n-1;++j)
     {
		for (r=0;r<k;++r)
			for (cc=0;cc<max_cif;++cc)
				if (cif[j+1][cc] != -1)
					{
					a[cif[j+1][cc]][((r*10)+cc)%k] += aa[j][r];
					a[cif[j+1][cc]][((r*10)+cc)%k] %= mod;
					}
     }
     if (i>=aaa)
     {
     for (j=1;j<n;++j)
	tot+=a[j][0];
     tot %= mod;
     }
     memcpy(aa,a,sizeof(a));
     }
}

int main()
{
	citire();
	cifre();
	dinamica();
	freopen("divz.out","w",stdout);
	printf("%ld",tot);
	fclose(stdout);
return 0;
}