Cod sursa(job #153497)

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

int K, lg1, lg2, i, j, k, x, raspuns, a[50][50][50], d[100][100][10], v[100], n;
char sir[105];

inline int md(int a){
	int x;
	
	if (a >= 0)
		x = k - a;
	else
		x = K + a;
	
	if (x % 2 == 0)
		x /= 2;
	if (x % 5 == 0)
		x /= 5;
	
	return x;
}
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';
	
	a[1][1][v[1] % K] = 1;
	a[1][0][0] = 1;
	/*
	for (i = 2; i <= n; i ++)
		for (j = 1; j <= n; j ++)
			for (k = 0; k < K; k ++){
				a[i][j][k] += a[i-1][j][k];
				
				x = md(k - v[i] % K);
				a[i][j][k] += a[i-1][j-1][x] - d[j][k][v[i]];
				d[j][k][v[i]] = a[i][j][k];
			}
	*/
	
	
	for (i = 1; i <= n; i ++)
		for (j = 0; j <= n; j ++)
			for (k = 0; k < K; k ++){
				a[i][j][k] -= d[j][k][v[i]];
				d[j][k][v[i]] = a[i][j][k];
				
				a[i+1][j][k] += a[i][j][k];
				a[i+1][j+1][(k*10 + v[i+1]) % K] += a[i][j][k];
			}
	/*
	for (i = 1; i <= n; i ++)
		for (j = 1; j <= n; j ++)
			for (k = 0; k < K; k ++)
				fprintf(stderr, "pentru %d si %d si %d avem --------> %d\n", i, j, k, a[i][j][k]);
	*/
	for (i = lg1; i <= lg2; i ++)
		for (k = 0; k < 10; k ++)
			raspuns += d[i][0][k];
	
	printf("%d\n", raspuns);
	
	return 0;
}