Cod sursa(job #2201135)

Utilizator Andrei_CotorAndrei Cotor Andrei_Cotor Data 3 mai 2018 18:14:58
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include<fstream>
#define Base 100000000
using namespace std;
ifstream fi("indep.in");
ofstream fo("indep.out");
typedef struct nr{int nrc,C[20];} NR;
NR Dp[2][1005];
int n,i,cr,A[505],j;

void adu(NR &a, NR &b)
{
    int i,T=0;
    if(b.nrc>a.nrc)
        a.nrc=b.nrc;
    for(i=1; i<=a.nrc; i++)
    {
        a.C[i]=a.C[i]+b.C[i]+T;
        T=a.C[i]/Base;
        a.C[i]%=Base;
    }
    while(T)
    {
        a.C[++a.nrc]=T%Base;
        T/=Base;
    }
}

int cmmdc(int a, int b)
{
    int r=a%b;
    while(r)
    {
        a=b;
        b=r;
        r=a%b;
    }
    return b;
}

void afis()
{
    int i,val;
    fo<<Dp[n%2][1].C[Dp[n%2][1].nrc];
    for(i=Dp[n%2][1].nrc-1; i>=1; i--)
    {
        val=Base/10;
        while(val>1 && val>Dp[n%2][1].C[i])
        {
            fo<<"0";
            val/=10;
        }
        fo<<Dp[n%2][1].C[i];
    }
}

int main()
{
    fi>>n;
    for(i=1; i<=n; i++)
        fi>>A[i];
    Dp[0][0].nrc=Dp[0][0].C[1]=1;
    for(i=1; i<=n; i++)
    {
        cr=i%2;
        for(j=0; j<=1000; j++)
            Dp[cr][j]=Dp[1-cr][j];
        for(j=0; j<=1000; j++)
            adu(Dp[cr][cmmdc(j,A[i])],Dp[1-cr][j]);
    }
    afis();
    fi.close();
    fo.close();
    return 0;
}