Cod sursa(job #8394)

Utilizator vrajalaMihai Viteazu, razboinicu luminii vrajala Data 24 ianuarie 2007 18:36:06
Problema Diviz Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

long a[201][100],aa[201][100],tot;
int aux,cc,n,aaa,b,k,i,j,r,t[201],cif[201][10];
int max_cif=10;
long mod=30103;
char c[200];
FILE *f;

void citire()
{
        f=fopen("diviz.in", "r");
	fscanf(f,"%d %d %d\n",&k,&aaa,&b);
        fscanf(f,"%s",c);
	n=strlen(c);
	for (i=0;i<n;++i)
		t[i]=c[i]-'0';
	fclose(f);
}

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=1;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<aaa;++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)
					{
                                         aux=((r*10)+cc)%k;
					a[cif[j+1][cc]][aux] += aa[j][r];
					if (a[cif[j+1][cc]][aux]>mod)
                                          	a[cif[j+1][cc]][aux]-=mod;
					}
     }
     memcpy(aa,a,sizeof(a));
     }
for (i=aaa;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]][aux] += aa[j][r];
					if (a[cif[j+1][cc]][aux]>mod)
                                          	a[cif[j+1][cc]][aux]-=mod;
					}
     }
     for (j=1;j<n;++j)
	tot+=a[j][0];
     tot %= mod;
     memcpy(aa,a,sizeof(a));
     }
}

int main()
{
	citire();
	cifre();
	dinamica();
	f=fopen("diviz.out","w");
	fprintf(f,"%ld",tot);
	fclose(f);
return 0;
}