Cod sursa(job #756402)

Utilizator matei_cChristescu Matei matei_c Data 9 iunie 2012 16:35:35
Problema Diviz Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include<cstdio>
#include<cstring>

const int MAX_N = 202 ;
const int MOD = 30103 ;
const int MAX_C = 10 ;

int a[MAX_N][MAX_N],b[MAX_N][MAX_N] ;
int cif[MAX_C][MAX_N];
char s[MAX_N];

int k,minim,maxim ;
int sol ;

int main()
{
	
	freopen("diviz.in","r",stdin);
	freopen("diviz.out","w",stdout);
	
	scanf("%d%d%d",&k,&minim,&maxim);
	scanf("%s",s);

	int n = strlen(s) ;
	
	for(int j=0;j<=9;++j)
	{	
		cif[j][n-1] = n ;
		cif[j][n] = n ;
	}	
	cif[s[n-1] - '0'][n-1] = n-1 ;
	
	for(int i=n-2;i>=0;--i)
	{
		for(int j=0;j<=9;++j)
		{	
			if( s[i] - '0' == j )
				cif[j][i] = i ;
			else
				cif[j][i] = cif[j][i+1] ;
		}	
	}

	for(int i=1;i<=9;++i)
		if( cif[i][0] < n )
			a [ cif[i][0] ][i % k] = 1 ;


	for(int ind=2;ind<=n;++ind)
	{
		
		for(int i=0;i<=n;++i)
			for(int j=0;j<=k;++j)
				b[i][j] = 0 ;

		for(int i=ind-2;i<n;++i)
		{	
			for(int j=0;j<k;++j)
			{	
				if( a[i][j] != 0 )
				{	
					for(int cifra=0;cifra<=9;++cifra)
					{	
						if( cif[cifra][i+1] != n )
						{
							b[ cif[cifra][i+1] ][ (j*10+cifra)%k ] += a[i][j] ;
							b[ cif[cifra][i+1] ][ (j*10+cifra)%k ] %= MOD ;
						}
					}
				}
			}
		}	

		for(int i=0;i<n;++i)
		{	
			for(int j=0;j<k;++j)
			{
				a[i][j] = b[i][j] ;
				if( j==0 && ind >= minim && ind <= maxim )
					sol = ( sol + b[i][j] ) % MOD ;
			}
		}
		
	}

	printf("%d\n",sol);
	
	return 0;

}