Pagini recente » Cod sursa (job #145898) | Cod sursa (job #3156789) | Politic2 | Cod sursa (job #1913052) | Cod sursa (job #5984)
Cod sursa(job #5984)
#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*);
void 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);
}
}
void Mare::operator+=(Mare &X) {
int i, t, v;
for (i = t = 0; i < X.size() || t; ++i, t /= BAZA) {
v = (t += (i < X.size() ? X[i] : 0) + (i < this->size() ? (*this)[i] : 0)) % BAZA;
if (i < this->size())
(*this)[i] = v;
else
this->PB(v);
}
}
Mare Mare::operator-(Mare &X) {
Mare R;
int i;
R = (*this);
for (i = 0; i < X.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 - 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 += 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] && i <= N && !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;
}