Cod sursa(job #360106)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 29 octombrie 2009 20:00:28
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <cstdio>
#include <cstring>
#define lm 210
#define km 110
#define X 30103

int p[11][lm][km], a[lm][km], b[lm][km], v[lm], k, aa, bb, t, n;
char s[lm];

int main()
{
	freopen("diviz.in","r",stdin);
	freopen("diviz.out","w",stdout);
	scanf("%d %d %d\n",&k,&aa,&bb);
	scanf("%s",s);
	n=strlen(s);
	int i, j, r, x, c;
	for (i=0; i<n; i++) v[i+1]=s[i]-'0';
	for (i=1; i<=n; i++)
	{
		c=v[i]%k;
		if (v[i]) a[1][c]=1;
		for (j=2; j<=i; j++)
		{
			for (r=0; r<k; r++)
			{
				x=10*r%k+c;
				x=x%k;
				a[j][x]+=b[j-1][r];
				a[j][x]%=X;
			}
		}
		for (j=1; j<=i; j++)
			for (r=0; r<k; r++) 
			{
				if (p[v[i]][0][0]>0) 
				{
					a[j][r]=a[j][r]-p[v[i]][j][r];
					if (a[j][r]<0) a[j][r]+=X;
					a[j][r]%=X;
				}
				p[v[i]][j][r]+=a[j][r];
				p[v[i]][j][r]%=X;
			}
		p[v[i]][0][0]++;
		for (j=1; j<=n; j++)
			for (r=0; r<k; r++) 
			{
				b[j][r]+=a[j][r];
				b[j][r]%=X;
				a[j][r]=0;
			}
	}
	for (i=aa; i<=bb; i++) t=(t+b[i][0])%X;
	printf("%d",t);
}