Pagini recente » Borderou de evaluare (job #3366525) | Borderou de evaluare (job #3366527) | Cod sursa (job #3366528) | Cod sursa (job #3366526) | Cod sursa (job #3366525)
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <stack>
#define MAXDIGIT 5000
#define BAZA ((long long)(1ULL << 32))
struct nrMare {
unsigned int dig[MAXDIGIT / 8];
int nrD;
void print(FILE *fout) { // printeaza nr in fout
nrMare aux;
aux.copy(*this); // auxiliar ca sa nu fie distructiva functia si pur si
// simplu sa printeze
std::stack<char> rez; // stiva temporara sa tin digitele in minte
if (nrD == 0)
fprintf(fout, "0");
while (nrD)
rez.push('0' + divide(10));
while (!rez.empty()) {
fputc(rez.top(), fout);
rez.pop();
}
this->copy(aux);
}
void multiply(int b) {
int i;
unsigned long long t = i = 0;
while (i < nrD || t > 0) {
t += (unsigned long long)b * (unsigned long long)dig[i];
dig[i] = (unsigned int)t;
t = t >> 32;
++i;
}
nrD = std::max(i, nrD);
}
int divide(int a) {
unsigned long long t = 0;
for (int i = nrD - 1; i >= 0; i--) {
t = t * BAZA + dig[i];
dig[i] = t / a;
t %= a;
}
while (nrD > 0 && dig[nrD - 1] == 0)
nrD--;
return t; // returneaza modulul
}
void add(const nrMare &a) {
int i;
unsigned long long t = i = 0;
while (i < nrD || i < a.nrD || t > 0) {
t += (unsigned long long)a.dig[i] + (unsigned long long)dig[i];
dig[i] = (unsigned int)t;
t = t >> 32;
++i;
}
nrD = std::max(i, nrD);
nrD = std::max(a.nrD, nrD);
}
inline void clear() {
memset(dig, 0, sizeof(dig[0]) * (MAXDIGIT / 8));
nrD = 0;
}
void set(int a) {
clear();
dig[0] = a;
nrD = 1;
}
// baga a in nr mare curent (operatorul = )
void copy(const nrMare &a) {
clear();
for (int i = 0; i < a.nrD; i++)
dig[i] = a.dig[i];
nrD = a.nrD;
}
}; // stiu ca structul e cam bloated dar poate imi va trebui in alta problema si
// doar dau copy paste
nrMare w, b, r, g, y, wAux, bAux, rAux, gAux, yAux;
int main() {
FILE *fin, *fout;
fin = fopen("culori3.in", "r");
fout = fopen("culori3.out", "w");
int n, i;
fscanf(fin, "%d", &n);
wAux.set(1), w.set(1);
bAux.set(1), b.set(1);
rAux.set(1), r.set(1);
gAux.set(1), g.set(1);
yAux.set(1), y.set(1);
for (i = 2; i <= n; i++) {
w.clear(), b.clear(), r.clear(), g.clear(), y.clear();
w.add(bAux);
b.add(wAux);
b.add(rAux);
r.add(bAux);
r.add(gAux);
g.add(rAux);
g.add(yAux);
y.add(gAux);
wAux.copy(w);
bAux.copy(b);
rAux.copy(r);
gAux.copy(g);
yAux.copy(y);
// stiu ca era mai simplu doi vectori de nr mari dar aia e
}
w.add(b);
w.add(r);
w.add(g);
w.add(y); // le bag pe toate in w
// afisez w;
// w.print(stdout);
// printf("%d ", w.nrD);
w.print(fout);
fprintf(fout, "\n");
return 0;
}