Cod sursa(job #551205)

Utilizator freak93Adrian Budau freak93 Data 10 martie 2011 15:13:16
Problema Pavare2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include<cstdio>
#include<cstring>

using namespace std;

const char iname[] = "pavare2.in";
const char oname[] = "pavare2.out";
const int maxn = 105;
const int maxl = 25;
const int mod10 = 100000000;
const int base10 = 8;

int a, b, n;

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

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

bool cmp(int A[], int B[]) {
	if (A[0] != B[0])
		return A[0] < B[0];
	for (int i = A[0]; i > 0; --i)
		if (A[i] != B[i])
			return A[i] < B[i];
	return false;
}

char s[maxn];
int W[maxn][maxl], B[maxn][maxl], k[maxl], start;
int i, j;

inline int max(const int &a, const int &b) {
	if (a < b)
		return b;
	return a;
}

int main() {
	freopen(iname, "r", stdin);
	freopen(oname, "w", stdout);

	scanf("%d%d%d\n", &n, &a, &b);
	fgets(s, sizeof(s), stdin);
	for (i = 0; s[i] != 0 && s[i] != '\n'; ++i);
	for (--i; i >= 0; i -= base10) {
		k[++k[0]] = 0;
		for (j = max(i - base10 + 1, 0); j <= i; ++j)
			k[k[0]] = k[k[0]] * 10 + s[j] - '0';
	}
	W[0][0] = W[0][1] = 1;
	B[0][0] = B[0][1] = 1;
	for (i = 1; i <= n; ++i) {
		memset(W[i], 0, sizeof(W[i]));
		memset(B[i], 0, sizeof(B[i]));
		for (j = max(i - b, 0); j < i; ++j)
			add(B[i], W[j]);
		for (j = max(i - a, 0); j < i; ++j)
			add(W[i], B[j]);
	}
	memset(W[n + 1], 0, sizeof(W[n + 1]));
	add(W[n + 1], W[n]);
	add(W[n + 1], B[n]);
	printf("%d", W[n + 1][W[n + 1][0]]);
	for (i = W[n + 1][0] - 1; i > 0; --i)
		printf("%08d", W[n + 1][i]);
	printf("\n");
	if (cmp(W[n], k))
		sub(k, W[n]), start = 1;
	else
		start = 0;
	i = n;
	while (i > 0) {
		if (start == 0) {
			for (j = max(i - a, 0); j < i && cmp(B[j], k); ++j)
				sub(k, B[j]);
			while (i > j)
				printf("0"), --i;
			start = 1;
			continue;
		}
		for (j = i - 1; j >= 0 && j > i - b && cmp(W[j], k); --j)
			sub(k, W[j]);
		while (i > j)
			printf("1"), --i;
		start = 0;
	}
	printf("\n");
}