Cod sursa(job #2062874)

Utilizator maria_sinteaMaria Sintea maria_sintea Data 10 noiembrie 2017 21:49:53
Problema Indep Scor 75
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <iostream>
#include <cstdio>
#define N 505
#define mod 100000000

using namespace std;

int n, a[N], sol[N*2][N];

void citire()
{
    scanf("%d\n", &n);
    for(int i=1;i<=n;i++)
        scanf("%d\n", &a[i]);
}

int cmmdc(int a, int b)
{
    if(b==0)
        return a;
    return cmmdc(b, a%b);
}

void adun(int rez[], int a[])
{
    int t=0;
    if(a[0]>rez[0])
    {
        for(int i=rez[0]+1;i<=a[0];i++)
            rez[i]=0;
        rez[0]=a[0];
    }
    else
        for(int i=a[0]+1;i<=rez[0];i++)
            a[i]=0;
    for(int i=1;i<=rez[0];i++)
    {
        int c=rez[i]+a[i]+t;
        rez[i]=c%mod;
        t=c/mod;
    }
    if(t)
       rez[++rez[0]]=t;
}

void initializare()
{
    for(int i=1;i<=1000;i++)
    {
        sol[i][0]=1;
        sol[i][1]=0;
    }
}

void calcul()
{
    int unu[2]={1, 1};
    initializare();
    sol[a[1]][1]=1;
    for(int i=2;i<=n;i++)
    {
        for(int j=1;j<=1000;j++)
        {
            int c=cmmdc(j, a[i]);
            adun(sol[c], sol[j]);
        }
        adun(sol[a[i]], unu);
    }
}

void afisare()
{
    printf("%d", sol[1][sol[1][0]]);
    for(int i=sol[1][0]-1;i>=1;i--)
        printf("%.8d", sol[1][i]);
}

int main()
{
    freopen("indep.in", "r", stdin);
    freopen("indep.out", "w", stdout);

    citire();
    calcul();
    afisare();
    return 0;
}