Cod sursa(job #5977)

Utilizator ProstuStefan-Alexandru Filip Prostu Data 16 ianuarie 2007 16:05:32
Problema Pavare2 Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.85 kb
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>

using namespace std;

#define PB push_back

class Mare: protected vector<int> {
	protected:
	static const int BAZA = 10000;
	public:
	void read(FILE*);
	Mare operator+(Mare);
	Mare operator-(Mare);
	void operator=(int);
	bool operator<(Mare);
	void write(FILE*);
};

void Mare::read(FILE *fin = stdin) {
	char buf[256];
	int i, p, aux;

	this->clear();

	fscanf(fin, " %s", buf);

	for (i = strlen(buf) - 1; i >= 0;) {
		
		for (p = 1, aux = 0; p < BAZA && i >= 0; p *= 10, --i)
			aux += (buf[i] - '0') * p;

		this->PB(aux);
	}
}

Mare Mare::operator+(Mare X) {
	Mare R;
	int i, t;

	R.reserve(max(X.size(), this->size()) + 1);
	for (i = t = 0; i < X.size() || i < this->size() || t; ++i, t /= BAZA)
		R.PB( (t += (i < X.size() ? X[i] : 0) + (i < this->size() ? (*this)[i] : 0)) % BAZA );
	
	return R;
}

Mare Mare::operator-(Mare X) {
	Mare R;
	int i;

	R = (*this);

	for (i = 0; i < R.size(); ++i) {
		R[i] -= X[i];
		if (R[i] < 0) R[i] += BAZA, --R[i + 1];
	}

	while (R.size() > 1 && *R.rbegin() == 0) R.pop_back();

	return R;
}

void Mare::operator=(int k) {
	this->clear();
	this->PB(k);
}

bool Mare::operator<(Mare X) {
	if (this->size() < X.size()) return true;
	if (this->size() > X.size()) return false;

	int i;

	for (i = X.size() - 1; i >= 0; --i) {
		if ((*this)[i] < X[i]) return true;
		if ((*this)[i] > X[i]) return false;
	}

	return false;
}

void Mare::write(FILE *fout = stdout) {
	fprintf(fout, "%d", *this->rbegin());
	Mare :: reverse_iterator it;

	for (it = ++this->rbegin(); it != this->rend(); ++it)
		fprintf(fout, "%.4d", *it);
}

//END CLASS DESCRIPTION

const int NMAX = 101;

int N;
int C[2];
Mare K, DP[NMAX][2][NMAX];

void read() {
	FILE *fin = fopen("pavare2.in", "rt");

	fscanf(fin, " %d %d %d", &N, &C[0], &C[1]);

	K.read(fin);

	fclose(fin);
}

void dinamica() {
	int i, j, k, p;

	DP[0][0][1] = 1; DP[0][1][1] = 1;

	for (i = 1; i <= N; ++i)
		for (j = 0; j < 2; ++j)
			for (k = 1; k <= C[j] && k <= i; ++k)
				for (p = 1; p <= C[j ^ 1]; ++p)
					DP[i][j][k] = DP[i][j][k] + DP[i - k][j ^ 1][p];
}

void out(FILE *fout, int v, int n) {
	int i;

	for (i = 0; i < n; ++i)
		fprintf(fout, "%d", v);
}

void write() {
	FILE *fout = fopen("pavare2.out", "wt");
	Mare sum;
	int i, j;
	bool ok;

	sum = 0;
	for (i = 0; i < 2; ++i)
		for (j = 1; j <= C[i]; ++j)
			sum = sum + DP[N][i][j];
	
	sum.write(fout);

	fprintf(fout, "\n");

	for (j = 0; N; j ^= 1) {
		ok = false;

		if (j == 0) {
			for (i = min(N, C[0]); i && !ok; --i)
				if (DP[N][0][i] < K)
					K = K - DP[N][0][i];
				else
					out(fout, 0, i), ok = true, N -= i;
		} else {
			for (i = 1; i <= C[1] && !ok; ++i)
				if (DP[N][1][i] < K)	
					K = K - DP[N][1][i];
				else
					out(fout, 1, i), ok = true, N -= i;
		}
	}

	fprintf(fout, "\n");

	fclose(fout);
}

int main() {
	
	read();

	dinamica();

	write();

	return 0;
}