Cod sursa(job #3366525)

Utilizator Emre12Isleam Emre Emre12 Data 2 octombrie 2026 13:33:09
Problema Patrate2 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.78 kb
#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;
}