Cod sursa(job #1702395)

Utilizator cristina_borzaCristina Borza cristina_borza Data 15 mai 2016 09:58:35
Problema Next Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb
#include <fstream>
#include <cstring>

#define MMAX 1000005
#define NMAX 200005

#define BASE 100000

using namespace std;

ifstream f("next.in");
ofstream g("next.out");

int a[NMAX] , sol[NMAX] , aux[3];
int n;

char sir[MMAX];

long long nmb;

void adun(int a[] , int b[]);
void inmult(int a[] , int b[] , long long c);
void afis(int a[]);
long long divide(int a[] , long long b);

int main() {
    f >> sir;
    n = strlen(sir);

    for(int i = n - 1 ; i >= 0 ; i -= 5) {
        int nr = 0 , pw = 1;
        for(int j = 0 ; j < 5 && i - j >= 0; ++j) {
            nr = nr + (sir[i - j] - '0') * pw;
            pw *= 10;
        }

        a[++a[0]] = nr;
    }

    f >> nmb;
    aux[1] = 1;
    aux[0] = 1;

    long long rest = divide(a , nmb);
    if(rest == 0) {
        inmult(sol , a , nmb);
        afis(sol);
        return 0;
    }

    adun(a , aux);
    inmult(sol , a , nmb);
    afis(sol);
    return 0;
}


void adun(int a[] , int b[]) {
    int t = 0;

    a[0] = max(a[0] , b[0]);
    for(int i = 1 ; i <= a[0] ; ++i) {
        a[i] = a[i] + b[i] + t;
        t = a[i] / BASE;
        a[i] %= BASE;
    }

    while(t) {
        a[++a[0]] = t % BASE;
        t /= BASE;
    }
}

void inmult(int a[] , int b[] , long long c) {
    long long t = 0;

    memset(a , 0 , sizeof(a));
    a[0] = b[0];

    for(int i = 1 ; i <= a[0] ; ++i) {
        long long aux =  (long long) b[i] * (long long)c + t;
        t = aux / BASE;
        a[i] = aux % BASE;
    }

    while(t) {
        a[++a[0]] = t % BASE;
        t /= BASE;
    }
}

void afis(int a[]) {
    for(int i = a[0] ; i >= 1 ; --i) {
        int aux = a[i] , nrc = 0;
        while(aux) {
            ++nrc;
            aux /= 10;
        }

        if(i != a[0]) {
            for(int j = nrc + 1 ; j <= 5 ; ++j) {
                g << 0;
            }
        }

        g << a[i];
    }
}

long long divide(int a[] , long long b) {
    long long R = 0;
    for(int i = a[0] ; i > 0 ; i--) {
        R = BASE * R + a[i];
        a[i] = R / b;
        R %= b;
    }

    while (!a[a[0]] && a[0] > 1)
        a[0]--;

    return R;
}