Cod sursa(job #782998)

Utilizator visanrVisan Radu visanr Data 1 septembrie 2012 22:50:42
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;

#define base 10000

int N, A[510], Sol[1010][2010], B[2010];

int cmmdc(int a, int b)
{
    if(!b) return a;
    else return cmmdc(b, a % b);
}


void Adun(int A[], int B[])
{
     if(B[0] > A[0])
     {
             for(int i = A[0] + 1; i <= B[0]; i++) A[i] = 0;
             A[0] = B[0];
     }else
     {
          for(int i = B[0] + 1; i <= A[0]; i++) B[i] = 0;
     }
     int T = 0;
     for(int i = 1; i <= A[0]; i++)
     {
             A[i] += B[i] + T;
             T = A[i] / base;
             A[i] %= base;
     }
     if(T) A[++A[0]] = T;
}


int main()
{
    freopen("indep.in", "r", stdin);
    freopen("indep.out", "w", stdout);
    int i, j;
    scanf("%i", &N);
    for(i = 1; i <= N; i++) scanf("%i", &A[i]);
    B[0] = B[1] = 1;
    for(i = 1; i <= N; i++)
    {
          for(j = 1; j <= 1000; j++)
                Adun(Sol[cmmdc(j, A[i])], Sol[j]);
          Adun(Sol[A[i]], B);
    }
    if(!Sol[1][Sol[1][0]]) printf("0\n");
    else 
    {
         printf("%d", Sol[1][Sol[1][0]]);
         for(i = Sol[1][0] - 1; i; i--) printf("%04d", Sol[1][i]);
    }
    return 0;
}