Cod sursa(job #156063)

Utilizator andrei.12Andrei Parvu andrei.12 Data 12 martie 2008 12:29:33
Problema Diviz Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include<stdio.h>
#include<string.h>

#define lg 205
#define BAZA 30103

int K, lg1, lg2, i, j, k, x, raspuns, v[lg], n, cif, nxt;
short a[2][lg][100], sr[11][lg];
char sir[lg];

int main()
{
	freopen("diviz.in", "rt", stdin);
	freopen("diviz.out", "wt", stdout);
	
	scanf("%d%d%d\n", &K, &lg1, &lg2);
	scanf("%s", sir);
	n = strlen(sir);
	for (i = 0; i < n; i ++)
		v[i+1] = sir[i]-'0';
	
	for (j = 0; j < 10; j ++)
		for (i = n; i; i --){
			if (v[i] == j)
				sr[j][i] = i;
			else
				sr[j][i] = sr[j][i+1];
//			printf("sr[%d][%d] este ---> %d\n", j, i, sr[j][i]);
		}

	for (i = 1; i < 10; i ++)
		a[0][sr[i][1]][i % K] = 1;

	for (i = 1; i <= n; i ++){
		for (j = 1; j <= n; j ++){
			if (i >= lg1 && i <= lg2){
				raspuns += a[0][j][0];

				if (raspuns >= BAZA)
					raspuns -= BAZA;
			}

			for (k = 0; k < K; k ++){
//				printf("a[%d][%d][%d] este ---> %d\n", i, j, k, a[0][j][k]);

				for (cif = 0; cif < 10; cif ++){
					nxt = sr[cif][j+1];

					a[1][nxt][(k*10 + cif) % K] +=  a[0][j][k];
					if (a[1][nxt][(k*10 + cif) % K] >= BAZA)
						a[1][nxt][(k*10 + cif) % K] -= BAZA;
				}
			}
		}

		for (j = 1; j <= n; j ++)
			for (k = 0; k < K; k ++)
				a[0][j][k] = a[1][j][k], a[1][j][k] = 0;
	}

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