Cod sursa(job #1059675)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 16 decembrie 2013 21:11:27
Problema Next Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <fstream>
#include <algorithm>
#define Nmax 1000005

using namespace std;

char sir[Nmax];
int a[Nmax],aux[Nmax];
long long D;

inline void Convert(long long x)
{
    while(x>0LL)
    {
        aux[++aux[0]]=x%10;
        x/=10;
    }
}

inline void Read()
{
    int i,aux,j;
    ifstream fin("next.in");
    fin.getline(sir, 1000009);
    for(i=0;sir[i]!='\0';++i)
        a[++a[0]]=sir[i]-'0';
    i=1; j=a[0];
    while(i<j)
    {
        aux=a[i]; a[i]=a[j]; a[j]=aux;
        ++i; --j;
    }
    fin>>D;
    fin.close();
}

inline long long Modulo(int a[], int n, long long p)
{
    int i;
    long long x=0LL,q;
    for(i=n;i>=1;i--)
    {
        x=x*10+1LL*a[i];
        q=x/p;
        x=x-q*p;
    }
    return x;
}

inline void Aduna(int a[], int &n, int b[], int m)
{
    int k,i,rest,x;
    rest=0;
    if(n>m)
    {
        k=n;
        for(i=m+1;i<=n;++i)
            b[i]=0;
    }
    else
    {
        k=m;
        for(i=n+1;i<=m;++i)
            a[i]=0;
    }
    for(i=1;i<=k;i++)
    {
        x=a[i]+b[i]+rest;
        if(x>=10)
        {
            a[i]=x-10;
            rest=1;
        }
        else
        {
            a[i]=x;
            rest=0;
        }
    }
    n=k;
    if(rest)
        a[++n]=rest;
}

inline void Solve()
{
    int i;
    long long rest;
    rest=Modulo(a,a[0],D);
    if(rest)
    {
        rest=D-rest;
        Convert(rest);
        Aduna(a,a[0],aux,aux[0]);
    }
    ofstream fout("next.out");
    for(i=a[0];i>0;--i)
        fout<<a[i];
    fout<<"\n";
    fout.close();
}

int main()
{
    Read();
    Solve();
    return 0;
}