Cod sursa(job #195040)

Utilizator Adriana_SAdriana Sperlea Adriana_S Data 16 iunie 2008 11:13:52
Problema Pavare2 Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 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];

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;
}

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

	int N, A, B, K;
	scanf("%d %d %d\n", &N, &A, &B);
	scanf("%d\n", &K);

	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");

	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;
}