Cod sursa(job #1653376)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 15 martie 2016 22:18:56
Problema Pavare2 Scor 55
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.86 kb
#include <fstream>
#include <algorithm>
#include <cstring>
#include <vector>

using namespace std;

ifstream fin("pavare2.in");
ofstream fout("pavare2.out");

const int dim = 105;

int dp[dim][2][dim][35], k[35], cntMax[2], aux[35];

char s[35];

void add(int a[], int b[]) {

	if (a[0] < b[0]) {

		for (int i = a[0] + 1; i <= b[0]; ++i)
			a[i] = 0;
		a[0] = b[0];

	}
	else {

		for (int i = b[0] + 1; i <= a[0]; ++i)
			b[i] = 0;

	}

	int t = 0;
	for (int i = 1; i <= a[0]; ++i) {

		a[i] += b[i] + t;
		t = a[i] / 10;
		a[i] = a[i] % 10;

	}

	if (t)
		a[++a[0]] = t;

}

void subtract(int a[], int b[]) {

	for (int i = b[0] + 1; i <= a[0]; ++i)
		b[i] = 0;

	int t = 0;
	for (int i = 1; i <= a[0]; ++i) {

		a[i] -= b[i] + t;
		if (a[i] < 0)
			t = 1;
		else
			t = 0;

		if (t == 1)
			a[i] += 10;

	}

	while (a[0] && a[a[0]] == 0)
		--a[0];

}

int comp(int a[], int b[]) {

	if (a[0] > b[0])
		return 1;
	if (a[0] < b[0])
		return -1;

	for (int i = a[0]; i; --i) {

		if (a[i] > b[i])
			return 1;
		if (a[i] < b[i])
			return -1;

	}

	return 0;

}

int main() {

	int n;
	fin >> n >> cntMax[0] >> cntMax[1];

	fin >> (s + 1);

	k[0] = strlen(s + 1);
	for (int i = k[0], j = 1; i; --i, ++j)
		k[j] = s[i] - '0';

	dp[1][0][1][0] = dp[1][0][1][1] = 1;
	dp[1][1][1][0] = dp[1][1][1][1] = 1;

	for (int i = 2; i <= n; ++i) {

		for (int curr = 0; curr < 2; ++curr) {

			aux[0] = 1, aux[1] = 0;

			for (int j = 1; j <= cntMax[curr ^ 1]; ++j)
				add(aux, dp[i - 1][curr ^ 1][j]);

			add(dp[i][curr][1], aux);

			for (int j = 2; j <= cntMax[curr]; ++j)
				add(dp[i][curr][j], dp[i - 1][curr][j - 1]);

		}

	}

	aux[0] = 1, aux[1] = 0;
	for (int curr = 0; curr < 2; ++curr)
		for (int i = 1; i <= cntMax[curr]; ++i)
			add(aux, dp[n][curr][i]);

	for (int i = aux[0]; i; --i)
		fout << aux[i];
	fout << '\n';

	int curr = 0, cnt = 0;
	for (int i = n; i;) {

		int len = cntMax[0];
		if (curr == 0)
			len -= cnt;
		len = min(len, i);

		bool ok = false;
		for (int j = len; j; --j) {

			if (comp(k, dp[i][0][j]) == 1) {

				subtract(k, dp[i][0][j]);
				continue;

			}

			i -= j;

			for (int step = 1; step <= j; ++step)
				fout << 0;

			if (curr == 0)
				cnt += j;
			else
				cnt = j;
			curr = 0;


			ok = true;
			break;

		}

		if (ok)
			continue;

		len = cntMax[1];
		if (curr == 1)
			len -= cnt;
		len = min(len, i);

		ok = false;
		for (int j = 1; j <= len; ++j) {

			if (comp(k, dp[i][1][j]) == 1) {

				subtract(k, dp[i][0][j]);
				continue;

			}

			i -= j;

			for (int step = 1; step <= j; ++step)
				fout << 1;

			if (curr == 1)
				cnt += j;
			else
				cnt = j;
			curr = 1;

			ok = true;
			break;

		}

	}

	fout << '\n';

	return 0;

}

//Trust me, I'm the Doctor!