Cod sursa(job #1783443)

Utilizator CiurezAndreiCiurez Marius-Andrei CiurezAndrei Data 18 octombrie 2016 23:56:09
Problema Next Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <bits/stdc++.h>

#define NMax 1000000


typedef unsigned long long Huge[NMax+3];
Huge A;

using namespace std;

//ifstream fin("next.in");
ofstream fout("next.out");

unsigned long long D, R;

int Sgn(Huge H1, Huge H2) {
  // Elimina zero-urile semnificative, daca exista.
  while (H1[0] && !H1[H1[0]]) H1[0]--;
  while (H2[0] && !H2[H2[0]]) H2[0]--;

  if (H1[0] < H2[0]) {
    return -1;
  } else if (H1[0] > H2[0]) {
    return +1;
  }

  for (int i = H1[0]; i > 0; --i) {
    if (H1[i] < H2[i]) {
      return -1;
    } else if (H1[i] > H2[i]) {
      return +1;
    }
  }
  return 0;
}

void Subtract(Huge A, Huge B)
/* A <- A-B */
{ int i, T=0;

  for (i=B[0]+1;i<=A[0];) B[i++]=0;
  for (i=1;i<=A[0];i++)
    A[i]+= (T=(A[i]-=B[i]+T)<0) ? 10 : 0;
    /* Adica A[i]=A[i]-(B[i]+T);
       if (A[i]<0) T=1; else T=0;
       if (T) A[i]+=10; */
  while (!A[A[0]] && A[0])
    A[0]--;
}

void Mult(Huge H, unsigned long long  X)
/* H <- H*X */
{ int i;
  unsigned long long T=0;

  for (i=1;i<=H[0];i++)
    { H[i]=H[i]*X+T;
      T=H[i]/10;
      H[i]=H[i]%10;
    }
  while (T) /* Cat timp exista transport */
    { H[++H[0]]=T%10;
      T/=10;
    }
}


void Add(Huge C, int unu)
{

    C[1] ++;
    unsigned long long T = C[1] / 10;
    for(int i = 2; i <= C[0]; i ++)
    {
        C[i] = C[i] + T;
        T = C[i] / 10;
        C[i] %= 10;
    }
}

unsigned long long Divide(Huge A, unsigned long long X)
/* A <- A/X si intoarce A%X */
{ int i;
  unsigned long long  R=0;

  for (i=A[0];i;i--)
    {
        R=10*R+A[i];
        A[i]= R / X;
        R%=X;
    }
  while (!A[A[0]] && A[0]>1) A[0]--;
  return R;
}

using namespace std;

int main()
{
    freopen("next.in", "r", stdin);

    char c = getc(stdin);

    while(isdigit(c))
    {
        A[ ++A[0] ] = c - '0';
        c = getc(stdin);
    }

    for (int i=1;i<=A[0]/2;i++)
       swap(A[i], A[ A[0] - i + 1 ]);

    fscanf(stdin, "%d", &D);

    R = Divide(A, D);

    if(R == 0)
    {
        for(int i = A[0]; i >= 1; i --)
        {
            fout << A[i];
        }
        return 0;
    }

    Add(A, 1);
    Mult(A, D);

    for(int i = A[0]; i >= 1; i --)
    {
        fout << A[i];
    }


    return 0;
}