Cod sursa(job #55545)

Utilizator TabaraTabara Mihai Tabara Data 27 aprilie 2007 19:10:46
Problema Next Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <fstream>
using namespace std;

#define in "next.in"
#define out "next.out"
#define NMAX 1000001

long long D;
int a[NMAX], b[NMAX], ind, n, sir[NMAX];
char c;

void Read();
void Solve();
void Write();
int mod(int A[], int B);
void add(int A[], int B[]);

void add(int A[], int B[])
{  
      int i, t = 0;  
      for (i=1; i<=A[0] || i<=B[0] || t; i++, t/=10)  
              A[i] = (t += A[i] + B[i]) % 10;  
      A[0] = i - 1;  
}

ofstream fout ( out );

long long mod(int A[], long long B)  
{  
      int i;
      long long t = 0;  
      for (i = A[0]; i > 0; i--)  
              t = (t * 10 + A[i]) % B; 
      return t;  
}

int main()
{
    Read();
    Solve();
    //Write();
    
    fout.close();
    return 0;
}

void Read()
{
    ifstream fin( in );
    int i;
    ind = 1;
    while ( fin.peek() != '\n' )
    {
        fin >> c;
        a[ind] = c - 48;
        ind++;
    } 
    ind--;
    a[0] = ind;
    
    n = 1;
    for ( i = ind; i >= 1; i-- )
    {
        b[n] = a[i];
        n++;
    }
    n--; b[0] = n;
    fin.get();
    fin >> D;
    fin.close();
    
}

void Write()
{
    int i;
    for ( i = b[0]; i >= 1; --i )
    {
        fout << b[i];
    }    
    
    fout << "\n" << D << "\n";
}   
          
void Solve()
{
    int i;
    long long r = mod( b, D );
    long long rest = (D-r)%D; 
    
    int dim = 1;
    long long restt = rest;
    while ( restt )
    {
        sir[dim] = restt % 10;
        restt /= 10;
        dim++;
    }    
    dim--;
    sir[0] = dim;
    /*for ( i = dim; i >= 1; --i )
        fout << sir[i];*/
    add( b, sir );
    for ( i = b[0]; i >= 1; --i )
        fout << b[i];
    //fout << "\n";
}