Cod sursa(job #80713)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 29 august 2007 15:21:36
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
# include <stdio.h>
# include <string.h>

const long int MODULO=30103;
const long int MAXM=200;
const long int MAXN=100;
long int nr[MAXM+5][10][MAXN+1];
long int n,k,a,b;
char s[1000];
long int p10[210];

void citire()
{
FILE *f=fopen("diviz.in","r");
fscanf(f,"%ld%ld%ld",&k,&a,&b);
fgets(s+1,900,f);
fgets(s+1,900,f);
n=strlen(s+1);
s[n]=s[n+1];
n--;
fclose(f);
}

long int normal(long int a)
{
if (a>=0) return a%k;
while (a<0) a+=k;
return a;
}

void init_p10()
{
p10[0]=1;
long int i;
for (i=1;i<=n+1;i++)
	p10[i]=(p10[i-1]*10)%k;
}

long int min(long int a,long int b) {if (a>b) return b; return a;}

long int calculeaza()
{
long int i,x,r,cf,cf2,norm;
for (i=n;i>=1;i--)
	{
	cf=(long int)s[i]-(long int)'0';
	if (cf>=0&&cf<=9)
	for (x=min(n-i+1,b);x>=2;x--)
		for (r=0;r<=k-1;r++)
			{
			nr[x][cf][r]=0;
			norm=r-p10[x-1]*cf;
			if (norm>=0) norm%=k;
                        else norm=(norm+k*k)%k;
		for (cf2=0;cf2<=9;cf2++)
			{
			nr[x][cf][r]+=nr[x-1][cf2][norm];
			nr[x][cf][r]%=MODULO;
			}
			}
	if (cf>=0&&cf<=9) nr[1][cf][cf%k]=1;
	}
long int sol=0;
for (cf=1;cf<=9;cf++)
for (i=a;i<=b;i++)
	{
	sol+=nr[i][cf][0];
	sol%=MODULO;
	}
return sol;
}

void scrie(long int a)
{
FILE *g=fopen("diviz.out","w");
fprintf(g,"%ld\n",a);
fcloseall();
}

int main()
{
citire();
init_p10();
long int sol=calculeaza();
scrie(sol);
return 0;
}