Cod sursa(job #88375)

Utilizator marius135Dumitran Adrian Marius marius135 Data 1 octombrie 2007 21:34:41
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include<stdio.h>
#include<string.h>

char c[201];
long t[202];
long v[2][202][102];
int main()
{
	freopen("diviz.in","r",stdin);
	freopen("diviz.out","w",stdout);
	long k,a,b,i,j,l,n,s=0;
	memset(v,0,sizeof(v));
	scanf("%ld %ld %ld",&k,&a,&b);
	scanf("%s",c);
	n = strlen(c);
	for(i=1;i<=n;i++)
		t[i] = c[i-1]-'0';
	// v [a][b][c] = cate posibilitati cu lungimea a ultimul numar b restul c
	
	v[0][0][0] = 1;
	long next[10];
	for(i = 0; i <= b ; i++)
	{
		long poz  = i%2;
		long poz2 = !poz;
		
		for( j = i; j <= n ; j++)
		{
			for(long ii=0;ii<=9;ii++)
				next[ii] =0;
			for(l=j+1;l<=n;l++)
				if(next[t[l]]==0) next[t[l]] = l;
		
			for( l = 0; l < k; l++)
			{
				if(!v[poz][j][l]) continue;
				if(i>=a && l == 0)
					{
					s = s+v[poz][j][l];
					s = s%30103;
					}
				for( long ii = 0; ii<=9;++ii)
					if(next[ii]  && (ii!=0 || i!=0))
						 v[poz2][next[ii]][(l*10+ii)%k] = (v[poz2][next[ii]][(l*10+ii)%k]+v[poz][j][l])%30103;
				v[poz][j][l] = 0;
			}
		}
		
	}
	
	printf("%ld\n",s);
	
	return 0;
}