Cod sursa(job #843200)

Utilizator dtoniucDaniel Toniuc dtoniuc Data 27 decembrie 2012 16:19:10
Problema Indep Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
using namespace std;

int n,a[510],p[1001][250],vmax;

void adauga(int p1,int p2)
{
    p[p1][0]=max(p[p1][0],p[p2][0]);
    for(int i=1;i<=p[p1][0];i++)
        {
            p[p1][i]+=p[p2][i];
            if(p[p1][i]>=10)
            {
                p[p1][i+1]+=p[p1][i]/10;
                p[p1][i]%=10;
                p[p1][0]+= (i == p[p1][0]);
            }
        }
}

void db(int p1)
{
    for(int i=1;i<=p[p1][0];i++)
        {
            p[p1][i]*=2;
            if(p[p1][i]>=10)
            {
                p[p1][i+1]+=p[p1][i]/10;
                p[p1][i]%=10;
                p[p1][0]+= (i == p[p1][0]);
            }
        }
}
int cmmdc(int a, int b)
{
    while(b)
    {
        int aux=b;
        b=a%b;
        a=aux;
    }
    if(a==1) return 1;
    return 0;
}
int main()
{
    ifstream fin("indep.in");
    ofstream fout("indep.out");
    fin>>n;
    for(int i=1;i<=n;i++)
    {
        fin>>a[i];
        if(a[i]>vmax) vmax=a[i];
    }
    p[0][0]=p[0][1]=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=vmax;j++)
       {
           if(cmmdc(a[i],j) == j) db(j);
           else adauga(cmmdc(a[i],j),j);
       }
       adauga(a[i],0);
    }

    if (p[1][0] == 0) p[1][0] = 1;
    for (int i = p[1][0]; i >= 1; --i)
        fout << p[1][i];

    return 0;
}