Cod sursa(job #112245)

Utilizator astronomyAirinei Adrian astronomy Data 3 decembrie 2007 22:44:27
Problema Grozavesti Scor Ascuns
Compilator c Status done
Runda Marime 1.11 kb
#include <stdio.h>
#include <string.h>

#define MAXC 1024
#define base 1000000
#define display "%06d"

typedef int num[MAXC];

int N, M[MAXC];
num res, P2;

void add(num A, num B)
{
    int i, t = 0;
    for(i = 1; i <= A[0] || i <= B[0] || t; i++, t /= base)
        A[i] = (t += A[i]+B[i]) % base;
    A[0] = i-1;
}

void mul(num A, int B)
{
    int i, t = 0;
    for(i = 1; i <= A[0] || t; i++, t /= base)
        A[i] = (t += A[i]*B) % base;
    A[0] = i-1;
}

void read_and_solve(void)
{
    int i, j, k;
    num aux;

    scanf("%d\n", &N);
    for(i = 1; i <= N; i++)
        scanf("%d\n", &M[i]);

    P2[0] = P2[1] = 1;
    res[0] = res[1] = 1, mul(res, M[1]);

    for(i = 2; i <= N; i++)
    {
        mul(P2, 2), memcpy(aux, P2, sizeof(num)), mul(aux, M[i]);
        add(res, aux);
    }

    j = res[0];

    printf("%d", res[j]);
    for(i = j-1; i >= 1; i--)
        printf(display, res[i]);
    printf("\n");
}

int main(void)
{
    freopen("hanoig.in", "rt", stdin);
    freopen("hanoig.out", "wt", stdout);

    read_and_solve();

    return 0;
}