Cod sursa(job #1429667)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 6 mai 2015 21:37:43
Problema Sarpe Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#define DIM 2048
using namespace std;

FILE *fin = fopen("sarpe.in" ,"r");
FILE *fout= fopen("sarpe.out","w");

int A[DIM], B[DIM], C[DIM], D[DIM], E[DIM];
char X;

inline void sub(int A[], int B[]) {
    int i, t = 0;
    for(i = 1; i <= A[0]; i ++) {
        A[i] -= ((i <= B[0]) ? B[i] : 0) + t;
        A[i] += (t = A[i] < 0) * 10;
    }
    for(A[0] = A[0]; A[0] > 1 && A[A[0]] == 0; A[0] --);
    return;
}

inline void mul(int A[], int B[]) {
    int i, j, t, C[DIM];
    memset(C, 0, sizeof(C));
    for(i = 1; i <= A[0]; i ++) {
        for(t = 0, j = 1; j <= B[0] || t; j ++, t /= 10)
            C[i+j-1] = (t += C[i+j-1] + A[i] * B[j]) % 10;
        if(i + j - 2 > C[0]) C[0] = i + j - 2;
    }
    memcpy(A, C, sizeof(C));
    return;
}

inline 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;
    return;
}

inline void SetUp() {
    X = 1;
    while(X != '\n') {
        X = 0;
        fscanf(fin, "%c", &X);
        if(X != '\n')
            A[++A[0]] = X - '0';
    }
    for(int i = 1; i <= A[0] / 2; i ++)
        swap(A[i], A[A[0]-i+1]);
    E[0] = E[1] = 1;
    return;
}

inline void CodeExpert(){
    if(A[0] == 1 && A[1] == 1) {
        fprintf(fout, "2\n");
        return;
    }
    add(B, A); add(B, A);
    add(B, A); add(B, A);
    sub(A, E);
    memcpy(D, A, sizeof(A));
    sub(D, E); mul(A, D);
    E[1] += 1; mul(A, E);
    add(B, A);
    for(int i = B[0]; i >= 1; i --)
        fprintf(fout, "%d", B[i]);
    return;
}

int main(){
    SetUp();
    CodeExpert();
    return 0;
}