Cod sursa(job #11278)

Utilizator DITzoneCAdrian Diaconu DITzoneC Data 31 ianuarie 2007 00:06:38
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <stdio.h>
#include <string.h>

#define FOR(i,s,d) for(i=(s);i<(d);++i)
#define f(c) (c-'0')
#define MOD 30103

char s[256];
int A[2][256][128],k,l,u,n,sol,last[10];

int main()
{
	freopen("diviz.in","r",stdin);
	freopen("diviz.out","w",stdout);
	int i,j,ii,t,x;
	scanf("%d %d %d",&k,&l,&u);	
	scanf("%s",s);
	n=strlen(s);
	FOR(i,0,n)
	{
		if(f(s[i]))
			A[1][i][f(s[i])%k]=1;
		if(l==1)
			sol+=A[1][i][0];
		if(sol>=MOD)
			sol-=MOD;
	}
	FOR(ii,1,u)
	{
		memset(last,-1,sizeof(last));
		memcpy(A[0],A[1],sizeof(A[1]));
		memset(A[1],0,sizeof(A[1]));
		FOR(i,0,n)
		{
			x=f(s[i])%k;
			FOR(t,0,10)				
				if(last[t]!=-1)
				{
					FOR(j,0,k)
					{
						if(last[t]!=-1&&A[0][last[t]][j])
						{
							A[1][i][x]+=A[0][last[t]][j];			
//							A[1][i][(j*10+f(s[i]))%k]+=A[0][last[t]][j];
							if(	A[1][i][x]>=MOD)
								A[1][i][x]-=MOD;
						}
						x=x+10;
						while(x>=k)
							x-=k;
					}
				}
			
			last[f(s[i])]=i;
		}	
		if(l<=ii+1&&ii<u)
			FOR(t,0,10)
				if(last[t]!=-1)
				{
					sol+=A[1][last[t]][0];
					if(sol>=MOD)
						sol-=MOD;
				}
	}
	printf("%d\n",sol);
	return 0;
}