Cod sursa(job #1593769)

Utilizator adiXMGemene Adrian adiXM Data 8 februarie 2016 20:54:03
Problema Next Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("next.in");
const int MAXDIGITS=10005;
const int Base=1000000;
char s[MAXDIGITS];
struct NumarMare
{
    int v[MAXDIGITS];
    NumarMare()
    {
        for(int i=0;i<MAXDIGITS;i++)
            v[i]=0;
    }
    NumarMare(long long x)
    {
        for(int i=0;i<MAXDIGITS;++i)
            v[i]=0;
        if(x==0)
            v[0]++;
        while(x>0)
        {
            v[++v[0]]=x%Base;
            x/=Base;
        }
    }
    NumarMare(char *s)
    {
        for(int i=0;i<MAXDIGITS;i++)
            v[i]=0;
        int n=strlen(s),nr=0,j;
        for(int i=n-1;i>=0;i-=6)
        {
            nr=0;
            for(j=max(0,i-5);j<=i;j++)
                nr=nr*10+s[j]-'0';
            v[++v[0]]=nr;
        }
    }
    inline void Afisare()
    {
        printf("%d",v[v[0]]);
        for(int i=v[0]-1;i>=1;i--)
             printf("%06d",v[i]);
    }
};
NumarMare operator + (NumarMare A,NumarMare B)
{
    NumarMare C;
    int t=0,i,d;
    d=max(A.v[0],B.v[0]);
    for(i=1;i<=d || t>0;i++)
    {
        t+=A.v[i]+B.v[i];
        C.v[i]=t%Base;
        t/=Base;
    }
    C.v[0]=i-1;
    return C;
}
inline int operator % (NumarMare A,long long x)
{
    int rest=0;
    for(int i=A.v[0];i>=1;i--)
        rest=(rest*Base+A.v[i])%x;
    return rest;
}
int main()
{
    freopen("next.out","w",stdout);
    long long d;
    f>>(s+1)>>d;
    NumarMare B(s+1);
    long long x=(d-(B%d));
    NumarMare V=B+x;
    V.Afisare();
    return 0;
}