Cod sursa(job #988105)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 22 august 2013 00:10:12
Problema Next Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

#define Nmax 1500000

typedef unsigned BigInteger[Nmax];

BigInteger N;
string s;
uint64_t D;

void read()
{
    ifstream f("next.in");

    f >> s >> D;

    f.close();
}

void init()
{
    for ( int i = s.length() - 1; i >= 0; i-- )
            N[ ++N[0] ] = s[i] - 48;
}

uint64_t modulo( BigInteger a, uint64_t divi )
{
    uint64_t R = 0;

    for ( uint64_t i = a[0]; i; i-- )
    {
        R = R * 10 + a[i];
        R %= divi;
    }

    return R;
}

void inmult( BigInteger &a, uint64_t x )
{
    uint64_t T = 0;

    for ( uint64_t i = 1; i <= a[0]; ++i )
    {
        a[i] = ( a[i] * x + T );
        T = a[i] / 10;
        a[i] %= 10;
    }

    while ( T )
            a[ ++a[0] ] = T % 10,
            T /= 10;
}

void aduna( BigInteger &a, uint64_t x )
{
    uint64_t T = 0;

    for ( uint64_t i = 1; i <= a[0] && ( T || x ); ++i )
    {
        a[i] = ( a[i] + x + T );
        T = a[i] / 10;
        a[i] %= 10;
        x /= 10;
    }

    if ( T )
            a[ ++a[0] ] = T;
}

void afis( BigInteger a )
{
    ofstream g("next.out");

    for ( uint64_t i = a[0]; i >= 1; i-- )
            g << a[i] ;

    g << "\n";

    g.close();
}

int main()
{
    read();
    init();

    uint64_t R = modulo( N, D );

    if ( R )
        aduna( N, D - R );

    afis( N );

    return 0;
}