Cod sursa(job #1109654)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 17 februarie 2014 14:16:50
Problema Sarpe Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <cstdio>
#include <algorithm>
#include <cstring>

#define NMAX 1000007

using namespace std;

int a[NMAX], b[NMAX], c[NMAX], d[NMAX], e[NMAX];
char s[NMAX];

void scad(int H[], int G[]){
    int T = 0;
    for(int i = 1; i <= H[i]; ++i){
        H[i] = H[i] - G[i] - T;
        if(H[i] < 0)
            T = 1;
        else
            T = 0;
        H[i] += T * 10;
    }
    while(H[H[0]] == 0)
        --H[0];
}

void adun(int H[], int G[]){
    int T = 0;
    H[0] = max(H[0], G[0]);
    for(int i = 1; i <= H[0]; ++i){
        H[i] += G[i] + T;
        T = H[i] / 10;
        H[i] %= 10;
    }
    while(T > 0){
        H[++H[0]] = T % 10;
        T /= 10;
    }
    while(H[H[0]] == 0)
        --H[0];
}

void prod(int H[], int x){
    int T = 0;
    for(int i = 1; i <= H[0]; ++i){
        H[i] = H[i] * x + T;
        T = H[i] / 10;
        H[i] %= 10;
    }
    while(T > 0){
        H[++H[0]] = T % 10;
        T /= 10;
    }
    while(H[H[0]] == 0)
        --H[0];
}

void prodH(int H[], int G[], int J[]){
    int T = 0;
    J[0] = H[0] + G[0] - 1;
    for(int i = 1; i <= H[0]; ++i)
        for(int j = 1; j <= G[0]; ++j)
            J[i + j - 1] += H[i] * G[j];
    for(int i = 1; i <= J[0]; ++i){
        J[i] += T;
        T = J[i] / 10;
        J[i] %= 10;
    }
    while(T > 0){
        J[++J[0]] = T % 10;
        T /= 10;
    }
    while(H[H[0]] == 0)
        --H[0];
}

int main(){
    freopen("sarpe.in", "r", stdin);
    freopen("sarpe.out", "w", stdout);
    gets(s + 1);
    a[0] = b[0] = d[0] = strlen(s + 1);
    for(int i = a[0]; i >= 1; --i){
        a[a[0] - i + 1] = s[i] - '0';
        b[b[0] - i + 1] = s[i] - '0';
        d[d[0] - i + 1] = s[i] - '0';
    }
    if(a[0] == a[1] == 1){
        printf("2\n");
        return 0;
    }
    prod(a, 4);
    c[0] = c[1] = 1;
    scad(b, c);
    c[0] = 1;
    c[1] = 2;
    scad(d, c);
    prodH(b, d, e);
    prod(e, 2);
    adun(a, e);
    for(int i = a[0]; i >= 1; --i)
        printf("%d", a[i]);
    return 0;
}