Cod sursa(job #7352)

Utilizator IgnitionMihai Moraru Ignition Data 21 ianuarie 2007 13:30:18
Problema Diviz Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <stdio.h>
#include <string.h>

#define MN (202)
#define MK (102)

int oldc[MN][MK], newc[MN][MK];
int N, n[MN], K, L1, L2, X;

int main()
{
	int i, j, k, l;
	char ch;

	freopen("diviz.in", "r", stdin);
	freopen("diviz.out", "w", stdout);
	
	scanf("%d %d %d ", &K, &L1, &L2);
	for(N = 0; ; ++ N) {
		scanf("%c", &ch);
		if(ch != '\n')
			n[N] = ch-'0';
		else break;
	}

	/*
	printf("%d %d %d\n", K, L1, L2);
	for(i = 0; i < N; ++ i)
		printf("%d ", n[i]); printf("\n");
		*/

	for(i = 0; i < N; ++ i) if(n[i])
		oldc[i][n[i]%K] = 1;

	/*
	for(i = 0; i < N; ++ i, printf("\n")) for(k = 0; k < K; ++ k)
		printf("%d ", oldc[i][k]);
		*/

	for(l = 2; l <= L2; ++ l) {
		memset(newc, 0, sizeof(newc));
		for(i = l-1; i < N; ++ i)
			for(j = l-2; j < i; ++ j)
				for(k = 0; k < K; ++ k)
					newc[i][(k*10+n[i])%K] += oldc[j][k];
		memcpy(oldc, newc, sizeof(oldc));
		if(l >= L1) for(i = l-1; i < N; ++ i)
			X += oldc[i][0];
	}

	printf("%d\n", X);

	return 0;
}