Cod sursa(job #155785)

Utilizator andrei.12Andrei Parvu andrei.12 Data 12 martie 2008 10:11:59
Problema Diviz Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include<stdio.h>
#include<string.h>

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

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 <= n; i ++)
		a[1][i][v[i] % K] = 1;

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

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

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

					a[i+1][nxt][(k*10 + cif) % K] += a[i][j][k];
				}
			}
		}


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