Cod sursa(job #195042)

Utilizator Adriana_SAdriana Sperlea Adriana_S Data 16 iunie 2008 12:04:47
Problema Pavare2 Scor 55
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.83 kb
#include <stdio.h>
#include <string.h>

const int N_MAX = 110;

char a[N_MAX][N_MAX][N_MAX], b[N_MAX][N_MAX][N_MAX];
char sol[N_MAX], catea[N_MAX], cateb[N_MAX], ca[N_MAX];

void add(char A[], char B[])
{
	int i, t = 0;
	for (i = 1; i <= A[0] || i <= B[0] || t; i ++, t /= 10) {
		A[i] = (t += A[i] + B[i]) % 10;
	}

	A[0] = i - 1;
}

void sub(char A[], char B[])
{
	int i, t = 0;
	for (i = 1; i <= A[0]; i ++) {
		A[i] -= B[i] + t;
		t = A[i] < 0;
		A[i] += t * 10;
	}
	
	for (; A[0] > 1 && !A[A[0]]; A[0] --);
}

int comp(char A[], char B[])
{
	if (A[0] != B[0]) return (A[0] < B[0]);
	else {
		for (int i = A[0]; i >= 1; i --) {
			if (A[i] != B[i]) return (A[i] < B[i]);
		}
	}

	return 1;
}

void afis(char v[])
{
	for (int i = v[0]; i >= 1; i --) printf("%d", v[i]);
	printf("\n");
}

int main()
{
	freopen("pavare2.in", "r", stdin);
#ifndef _SCREEN_
	freopen("pavare2.out", "w", stdout);
#endif

	int N, A, B, K = 0, dim = 0;
	char c;

	scanf("%d %d %d\n", &N, &A, &B);
	while (scanf("%c\n", &c) != EOF) ca[++ dim] = c - '0';

	ca[0] = dim;
	if (ca[0] == 1 && ca[1] == 1) K = 1;
	else {
		for (int i = 1; i <= ca[0]; i ++) {
			char aux = ca[i];
			ca[i] = ca[ca[0] - i + 1];
			ca[ca[0] - i + 1] = aux;
		}
	}

	a[1][1][0] = a[1][1][1] = 1, b[1][1][0] = b[1][1][1] = 1;
	for (int i = 2; i <= N; i ++) {
		for (int j = 1; j <= i; j ++) {

			a[i][j][0] = b[i][j][0] = 1;
			if (j > A) a[i][j][0] = 1;
			else {
				if (j >= 2) memcpy(a[i][j], a[i - 1][j - 1], sizeof(a[i - 1][j - 1]));
				else {

					for (int k = 1; k <= B; k ++) add(a[i][j], b[i - 1][k]);
				}
			}

			if (j > B) b[i][j][0] = 1;
			else {
				if (j >= 2) memcpy(b[i][j], b[i - 1][j - 1], sizeof(b[i - 1][j - 1]));
				else {

					for (int k = 1; k <= A; k ++) add(b[i][j], a[i - 1][k]);
				}
			}
		}
	}

	sol[0] = 1;
	for (int i = 1; i <= A; i ++) add(sol, a[N][i]);
	for (int i = 1; i <= B; i ++) add(sol, b[N][i]);

	for (int i = sol[0]; i >= 1; i --) printf("%d", sol[i]);
	printf("\n");

	if (K == 1) {
		int j;
		for (int i = 1; i <= N;) {
			for (j = i; j <= i + A - 1 && j <= N; j ++) printf("0");
			if (j <= N) printf("1");
			i = i + A + 1;
		}
		printf("\n");

		return 0;
	}

	int lasta = 0, lastb = 0, last = -1;
	for (int i = 1; i <= N; i ++) {

		memset(catea, 0, sizeof(catea));
		memset(cateb, 0, sizeof(cateb));
		catea[0] = cateb[0] = 1;

		for (int j = 1; j <= A - lasta; j ++) add(catea, a[N - i + 1][j]);
		for (int j = 1; j <= B - lastb; j ++) add(cateb, b[N - i + 1][j]);

//		afis(ca);

		if (comp(ca, catea)) {
			printf("0");
			if (last == 0) lasta ++;
			else {
				last = 0;
				lasta = 1;
				lastb = 0;
			}
		}
		else {
			printf("1");
			if (last == 1) lastb ++;
			else {
				last = 1;
				lastb = 1;
				lasta = 0;
			}
//			printf("scad:\n");
//			afis(ca);
//			afis(catea);
			sub(ca, catea);
//			printf("rezultat:\n");
//			afis(ca);
		}
	}
	printf("\n");

	return 0;
}