Cod sursa(job #3366605)

Utilizator Emre12Isleam Emre Emre12 Data 2 octombrie 2026 17:05:22
Problema Next Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.11 kb
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <fstream>
#include <stack>

#define MAXDIGIT 1000000
#define BAZA ((long long)(1ULL << 32))
#define BAZAPRINT (unsigned int)(1e9)

struct nrMare {
  unsigned int dig[MAXDIGIT / 8];
  int nrD;
  void scan(std::istream &fin) {
    clear();
    std::string buf;
    fin >> buf;
    for (int i = 0; i < buf.size(); i++) {
      multiplyInt(10);
      addInt(buf[i] - '0');
    }
  }
  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<int> rez; // stiva temporara sa tin digitele in minte
    if (nrD == 0)
      fprintf(fout, "0");
    while (nrD)
      rez.push(divide(BAZAPRINT));
    fprintf(fout, "%d", rez.top());
    rez.pop();
    while (!rez.empty()) {
      fprintf(fout, "%09d", rez.top());
      rez.pop();
    }
    // this->copy(aux);
  }
  void multiplyInt(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);
  }
  /*void multiplyHuge( const nrMare& b){
    int i,j;
    unsigned long long t = i = 0;
    while(i < b.nrD || t > 0) {
      t = j = 0;
      while(i < nrD || t > 0){
        t += (unsigned long long)b.dig[i] + (unsigned long long)dig[i];
        dig[i] = (unsigned int)t;
        t = t >> 32;
        ++i;
      }
    }
  }*/
  int divide(unsigned long long 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);
  }
  void addInt(unsigned long long a) {
    int i;
    unsigned long long t = i = 0;
    while (a || t > 0) {
      t += (unsigned long long)dig[i] + (unsigned int)a;
      dig[i] = (unsigned int)t;
      t = t >> 32;
      ++i;
      a = a >> 32;
    }
    nrD = std::max(i, 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
int main() {
  FILE *fout;
  std::ifstream fin("next.in");
  fout = fopen("next.out", "w");

  unsigned long long d, mod;
  nrMare n, aux; // aux, pt ca functia divide e distructiva
  n.scan(fin);
  fin >> d;
  aux.copy(n);

  mod = n.divide(d);
  aux.addInt(d - mod);

  aux.print(fout);
  return 0;
}