Cod sursa(job #138997)

Utilizator marius135Dumitran Adrian Marius marius135 Data 19 februarie 2008 16:48:27
Problema Diviz Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include<stdio.h>
#include<string.h>

#define maxn (1<<8)

long k,a,b;
char sir[maxn];
unsigned short int v[101][100][101];
long next[maxn][16];

int main()
{
	freopen("diviz.in","r",stdin);
	freopen("diviz.out","w",stdout);
	
	scanf("%ld %ld %ld",&k,&a,&b);
	scanf("%s",sir);
	
	long n = strlen(sir);
	
	for( long cif = 0; cif <= 9; ++cif)
	{
		long max = n+1;
		for(long i = n; i >= 0 ; --i)
		{
			next[i][cif] = max;
			if( sir[i] -'0' == cif)
				max = i;
			
		}
		if( max != n+1 && cif != 0)
		{
			v[max][cif%k][1] = 1;
		}
	}
	long sol =0;
	
	for( long i = 0;  i < n; ++i)
	{
		for( long j = 0; j < k; ++j)
		{
			for( long l = 1; l <= i+1; ++l)
			{
				if( v[i][j][l] == 0 ) continue;
				if( l >= a && l <= b && j == 0)
				{
					sol+=v[i][j][l];
					if( sol >= 30103)
						sol-= 30103;
				}
				if( l == b) continue;
			
				for( long cif = 0; cif <= 9; ++cif)
				{
					long aux = next[i][cif];
					if( aux == n+1) continue;
					long aux2 = j + cif;
					while( aux2 >= k)
						aux2-=k;
					v[aux][aux2][l+1]+=v[i][j][l];
					if( v[aux][aux2][l+1] >= 30103)
						v[aux][aux2][l+1] -= 30103;
				}
			}
		}
	}
	printf("%ld\n",sol);
	
	return 0;
}