Cod sursa(job #2182991)

Utilizator ardutgamerAndrei Bancila ardutgamer Data 22 martie 2018 18:52:57
Problema Next Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <cstdio>
#include <cstring>

using namespace std;

const int NMAX = 1000005;
char s[NMAX];
int a[NMAX];
int b[NMAX];

inline long long int modulo(int a[NMAX],long long int k)
{
    long long int r;
    long long int aux=0;
    for(int i = a[0] ; i >= 1 ; i--)
        aux = (aux * 10 + a[i])%k;
    return k-aux;
}

inline void getHuge(int a[NMAX],long long int nr)
{
    while(nr)
    {
        a[++a[0]] = nr % 10;
        nr /= 10;
    }
}

inline void aduna(int a[NMAX],int b[NMAX])
{
    int i,t=0;
    if (b[0] > a[0])
        {
            for (i=a[0]+1;i<=b[0];i++)
                a[i]=0;
            a[0]=b[0];
        }
    else
        for (i= b[0] + 1 ; i <= a[0] ; i++)
            b[i]=0;
    for (i=1;i<=a[0];i++)
    {
        a[i] += b[i] + t;
        t = a[i] / 10;
        a[i] %= 10;
    }
  if (t) a[++a[0]]=t;
}

int main()
{
    freopen("next.in","r",stdin);
    freopen("next.out","w",stdout);
    long long int nr;
    long long int r;
    gets(s);
    scanf("%lld",&nr);
    for(int i = strlen(s)-1 ; i >= 0 ; i--)
        a[++a[0]] = (s[i]-'0');
    r = modulo(a,nr);
    if(r == 0)
        r = nr;
    getHuge(b,r);
    aduna(a,b);
    for(int i = a[0] ; i >= 1 ; i--)
        printf("%d",a[i]);
    return 0;
}