Cod sursa(job #390911)

Utilizator John_the_BraveJohn Abruzzi John_the_Brave Data 4 februarie 2010 19:36:24
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include<stdio.h>
#include<vector>
using namespace std;

#define NMAX 202
#define CMAX 12
#define KMAX 101
#define MOD 30103

//int V[NMAX];
int P[CMAX];
vector< int > C[CMAX];

int F[CMAX][NMAX],M[2][NMAX][KMAX];

//I am but a shadow

int main()
{
	freopen("diviz.in","r",stdin);
	freopen("diviz.out","w",stdout);
	
	int K,A,B;
	scanf("%d%d%d\n",&K,&A,&B);
	
	int N=0;
	
	char ch;
	int cfr;
	
	for( int i=0; i<=9; ++i ) P[i]=-1;
	
	while( scanf("%c",&ch)!=EOF )
	{
		cfr=(int)ch-48;
		
		//V[ ++N ]=cfr;
		C[ cfr ].push_back( ++N );
		P[cfr]=0;
	}

	//initializare a matricei F[cifra][pozitia i]
	//prima pozitia a cifrei in V[] dupa i
	
	int i,j,r,p,x;
	for( i=0; i<=N; ++i )
	{
		for( x=0; x<=9; ++x )
		{
			if( P[x]==-1 ) continue;
		
			if( i==C[x][ P[x] ] )
			{	++P[x];
				if( P[x]==C[x].size() )
				{	
					P[x]=-1; 
					continue;
				}
			}
			
			F[x][i]=C[x][ P[x] ];
		}
	}
	
	//initializarea mega-matricei S[j][i][r]
	//cazul j=1,i=0;
	
	int k1=0,k2=1;
	for( p=1; p<=9; ++p )
		M[k1][ F[p][0] ][ p%K ]=1;
	
	int ans=0;
	
	for( j=1; j<=B; ++j )
	{
		//if( !k1 ) k1=1,k2=0;
		//else k1=0,k2=1;
		
		for(i=j; i<=N; ++i)
			for(r=0; r<K; ++r)
				M[k2][i][r]=0;
		
		for( i=j; i<=N; ++i )
		{
			for( r=0; r<K; ++r )
			{
				if( !M[k1][i][r] ) continue;
					
				for( p=0; p<=9; ++p )
				{
					if( F[p][i] )
					{
						int a1=F[p][i],a2=((r*10)+p)%K; // Oh, the shame
						
						M[k2][a1][a2]=(M[k2][a1][a2]+M[k1][i][r])%MOD;
						
						//M[j+1][ F[p][i] ][ ((r*10)+p)%K ]+=M[j][i][r];
					}
				}
			}
			
			if( j>=A )
			ans=(ans+M[k1][i][0])%MOD;
		}
		
		k1^=k2;k2^=k1;k1^=k2;
	}
	
	printf("%d\n",ans%MOD);
	
	return 0;
}