Cod sursa(job #827873)

Utilizator ericptsStavarache Petru Eric ericpts Data 2 decembrie 2012 19:18:51
Problema Indep Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <cstdio>
#include <cstring>
using namespace std;
const int baza = 1000000000;
short int v[505];
int D[1005][505];
int maxval,n;
int unu[505] = {1,1};
inline int gcd(int a,int b)
{
    if(a<b)
        return gcd(b,a);
    if(!b)
        return a;
    int r = a % b;
    while(r)
    {
        a=b;
        b=r;
        r=a%b;
    }
    return b;
}

void aduna(int *a,int *b)
{
    int i,t;
    for(i=1,t=0;i<=a[0] || i <= b[0] || t;++i,t/=baza)
        a[i] = (t+=a[i]+b[i])%baza;
    a[0]=i-1;
}

void solve()
{
    int i,j;
    for(i=1;i<=n;++i)
    {
        for(j=1;j<=maxval;++j)
            aduna(D[gcd(v[i],j)],D[j]);
        aduna(D[v[i]],unu);
    }
}
void print(int *d)
{
    printf("%d",d[d[0]]);
    int i = d[0]-1;
    for(;i;--i)
        printf("%.9d",d[i]);
    printf("\n");
}
int main()
{
    freopen("indep.in","r",stdin);
    freopen("indep.out","w",stdout);
    int i;
    scanf("%d",&n);
    for(i=1;i<=n;++i)
    {
        scanf("%d",v+i);
        if(v[i]>maxval)
            maxval=v[i];
    }
    solve();
    print(D[1]);
    return 0;
}