Cod sursa(job #2770028)

Utilizator CristeaCristianCristea Cristian CristeaCristian Data 18 august 2021 21:43:39
Problema Next Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.73 kb
/*#include <fstream>
#include <algorithm>
#include <cstring>

using namespace std;
ifstream fin("next.in");
ofstream fout("next.out");
const int MAXDIGITS = 1000005;
const int BASE = 10;
char s[MAXDIGITS];
class HUGE
{
private:
    int x[MAXDIGITS];
public:
    void print()
    {
        for(int i=x[0]; i>0; i--)
            fout << x[i];
        fout << '\n';
    }
    void set_char(char s[MAXDIGITS])
    {
        memset(x, 0, sizeof(x));
        x[0] = strlen(s);
        int n = strlen(s)-1;
        for(int i = 1; i <= x[0]; i++)
        {
            x[i] = s[n]-'0';
            n--;
        }
    }
    // Supraincarcarea operatorilor aritmetici
    HUGE operator += (long long a);
    long long operator % (int k);
};
HUGE HUGE::operator += (long long a)
{
    // x = x + other.x;
    int i, tr, aux;
    for(i=1, tr=0; i<=x[0]; i++)
    {
        aux = x[i] + a % 10 + tr;
        x[i] = aux % BASE;
        tr = aux / BASE;
        a/=10;
    }
    if(tr)
        x[++x[0]] = tr;
    return (*this);
}
long long HUGE::operator % (int k)
{
    int i, r=0;
    for (i=x[0]; i>=1; i--)
    {
        r = r * 10 + x[i];
        r = r % k;
    }
    return r;
}
HUGE a;
int main()
{
    ios_base::sync_with_stdio(0);
    fin.tie(0);
    long long d, r, aux;
    fin >> s >> d;
    a.set_char(s);
    r = a % d;
    if(!r)
        a.print();
    else
    {
        aux = d - r;
        a += aux;
        a.print();
    }
    return 0;
}
*/

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>

using namespace std;

const int NMAX=1000000;
int v[NMAX+5],c[NMAX+5];
void hn_constr(long long n,int a[NMAX+5])
{
    memset(a,0,sizeof(a));
    do
    {
        a[++a[0]]=n%10;
        n/=10;
    }while(n);
}
long long hn_divide_rest(int a[],long long b)
{
  long long r;
  int i;
  r=0;
  for(i=a[0];i>=1;--i)
  {
    r=r*10+a[i];
    r=r%b;
  }
  return r;
}
void hn_adun(int a[],int b[])
{
    int tr,i,aux;;
    tr=0;
    for(i=1;i<=a[0];++i)
    {
        aux=(a[i]+b[i]+tr);
        a[i]=aux%10;
        tr=aux/10;
    }
    if(tr)
        a[++a[0]]=1;
}
void print(int x[])
{
  int i;
  for(i=x[0];i>=1;--i)
    printf("%d",x[i]);
}
int main()
{
    freopen("next.in","r",stdin);
    freopen("next.out","w",stdout);
    long long d,r;
    char ch;
    while(scanf("%c",&ch) && ch!='\n')
        v[++v[0]]=ch-48;
    reverse(v+1,v+v[0]+1);
    scanf("%lld",&d);
    r=hn_divide_rest(v,d);
    if(r==0)
        print(v);
    else
    {
        long long ans=d-r;
        memset(c,0,sizeof(c));
        hn_constr(ans,c);
        hn_adun(v,c);
        print(v);
        printf("\n");
    }
    return 0;
}