Cod sursa(job #1523033)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 12 noiembrie 2015 12:58:07
Problema Next Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <cstdio>
#include <cctype>
#define BUF_SIZE 4096
#define MAXN 1000001
int pos=BUF_SIZE, poz=0, a[MAXN+1];
char buf[BUF_SIZE], buf2[BUF_SIZE];
FILE *fin, *fout;
inline char nextch(){
    if(pos==BUF_SIZE){
        fread(buf, BUF_SIZE, 1, fin);
        pos=0;
    }
    return buf[pos++];
}
inline long long read(){
    long long x=0;
    char ch=nextch();
    while(!isdigit(ch)){
        ch=nextch();
    }
    while(isdigit(ch)){
        x=10*x+ch-'0';
        ch=nextch();
    }
    return x;
}
inline void putch(char ch){
    buf2[poz++]=ch;
    if(poz==BUF_SIZE){
        fwrite(buf2, BUF_SIZE, 1, fout);
        poz=0;
    }
}
inline void citeste(int a[]){
    char ch=nextch();
    while(ch!='\n'){
        a[++a[0]]=ch-'0';
        ch=nextch();
    }
}
inline void reverse(int a[]){
    int i, j, aux;
    for(i=1, j=a[0]; i<j; i++, j--){
        aux=a[i];
        a[i]=a[j];
        a[j]=aux;
    }
}
inline long long rest(int a[], long long d){
    long long tr=0;
    for(int i=a[0]; i>0; i--){
        tr=(tr*10)+a[i];
        while(tr>=d){
            tr-=d;
        }
    }
    return tr;
}
inline void adun(int a[], long long b){
    long long tr=b, i=1;
    while(tr>0){
        tr+=a[i];
        a[i]=tr%10;
        tr/=10;
        i++;
    }
    i--;
    if(i>a[0]){
        a[0]=i;
    }
}
inline void afisez(int a[]){
    for(int i=a[0]; i>0; i--){
        putch(a[i]+'0');
    }
    if(poz>0){
        fwrite(buf2, poz, 1, fout);
    }
}
int main(){
    long long r, d;
    fin=fopen("next.in", "r");
    fout=fopen("next.out", "w");
    citeste(a);
    reverse(a);
    d=read();
    r=rest(a, d);
    if(r!=0){
        adun(a, d-r);
    }
    afisez(a);
    fclose(fin);
    fclose(fout);
    return 0;
}